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 fe5a971ddb9c2a9901d3f91c6b579ae5601a02a5
Author: Siegfried Goeschl <[email protected]>
AuthorDate: Wed Feb 3 14:19:26 2021 +0100

    FREEMARKER-172 [freemarker-generator] Start with refactoring
---
 .../DataSourceLoader.java}                         | 35 ++++----
 .../datasource/loader/DefaultDataSourceLoader.java | 56 +++++++++++++
 .../loader/EnvironmentDataSourceLoader.java        | 98 ++++++++++++++++++++++
 .../datasource/loader/FileDataSourceLoader.java    | 63 ++++++++++++++
 .../datasource/loader/HttpDataSourceLoader.java    | 68 +++++++++++++++
 .../freemarker/generator/base/uri/NamedUri.java    | 22 +++++
 .../generator/base/util/OperatingSystem.java       |  2 -
 .../freemarker/generator/base/util/UriUtils.java   |  1 +
 8 files changed, 324 insertions(+), 21 deletions(-)

diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/OperatingSystem.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceLoader.java
similarity index 58%
copy from 
freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/OperatingSystem.java
copy to 
freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceLoader.java
index 2a4c84c..e23354b 100644
--- 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/OperatingSystem.java
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceLoader.java
@@ -14,27 +14,24 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.freemarker.generator.base.util;
+package org.apache.freemarker.generator.base.datasource;
 
-import java.util.Locale;
+public interface DataSourceLoader {
 
-/**
- * Helper class to detect the operting system (mostly Windows).
- *
- * TODO should be moved to "freemarker-generator-base"
- */
-public class OperatingSystem {
-    private static final String OS = System.getProperty("os.name", 
"unknown").toLowerCase(Locale.ROOT);
-
-    public static boolean isWindows() {
-        return OS.contains("win");
-    }
+    /**
+     * Check if the source would be accepted
+     *
+     * @param source source
+     * @return true if the instance wold be able to load a data source
+     */
+    boolean accept(String source);
 
-    public static boolean isMac() {
-        return OS.contains("mac");
-    }
+    /**
+     * Load a DataSource.
+     *
+     * @param source source of the data source
+     * @return DataSource
+     */
+    DataSource load(String source);
 
-    public static boolean isUnix() {
-        return OS.contains("nux");
-    }
 }
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
new file mode 100644
index 0000000..91df861
--- /dev/null
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/loader/DefaultDataSourceLoader.java
@@ -0,0 +1,56 @@
+/*
+ * 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.loader;
+
+import org.apache.freemarker.generator.base.datasource.DataSource;
+import org.apache.freemarker.generator.base.datasource.DataSourceLoader;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static java.util.Objects.requireNonNull;
+
+/**
+ * Loads DataSource by delegating the loading to a list of "DataSourceLoader".
+ */
+public class DefaultDataSourceLoader implements DataSourceLoader {
+
+    private final List<DataSourceLoader> dataSourceLoaders;
+
+    public DefaultDataSourceLoader(List<DataSourceLoader> dataSourceLoaders) {
+        this.dataSourceLoaders = new 
ArrayList<>(requireNonNull(dataSourceLoaders));
+    }
+
+    @Override
+    public boolean accept(String source) {
+        return dataSourceLoaders.stream()
+                .anyMatch(loader -> loader.accept(source));
+    }
+
+    @Override
+    public DataSource load(String source) {
+        return get(source).load(source);
+    }
+
+    private DataSourceLoader get(String source) {
+        return dataSourceLoaders.stream()
+                .filter(loader -> loader.accept(source))
+                .findFirst()
+                .orElseThrow(() -> new IllegalArgumentException("Don't know 
how to load: " + source));
+    }
+
+}
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
new file mode 100644
index 0000000..61403e8
--- /dev/null
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/loader/EnvironmentDataSourceLoader.java
@@ -0,0 +1,98 @@
+/*
+ * 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.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.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;
+
+/**
+ * Load a DataSource based on a single environment variable or all 
environments variables.
+ */
+public class EnvironmentDataSourceLoader implements DataSourceLoader {
+
+    private static final String ROOT_DIR = "/";
+
+    @Override
+    public boolean accept(String source) {
+        return isNotEmpty(source) && source.startsWith("env://");
+    }
+
+    @Override
+    public DataSource load(String source) {
+        final NamedUri namedUri = NamedUriStringParser.parse(source);
+        final String key = stripRootDir(namedUri.getUri().getPath());
+        final String contentType = 
namedUri.getMimeTypeOrElse(Mimetypes.MIME_TEXT_PLAIN);
+        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);
+        } 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);
+        }
+    }
+
+    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.
+     */
+    private static String stripRootDir(String value) {
+        if (value.startsWith(ROOT_DIR)) {
+            return value.substring(ROOT_DIR.length());
+        } else {
+            return value;
+        }
+    }
+
+}
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
new file mode 100644
index 0000000..211713a
--- /dev/null
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/loader/FileDataSourceLoader.java
@@ -0,0 +1,63 @@
+/*
+ * 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.loader;
+
+import org.apache.freemarker.generator.base.datasource.DataSource;
+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;
+
+import static 
org.apache.freemarker.generator.base.FreeMarkerConstants.DEFAULT_GROUP;
+import static org.apache.freemarker.generator.base.util.StringUtils.isNotEmpty;
+
+public class FileDataSourceLoader implements DataSourceLoader {
+
+    private static final Charset NO_CHARSET = null;
+
+    @Override
+    public boolean accept(String source) {
+        return isNotEmpty(source) && (!source.contains("://") || 
source.startsWith("file://"));
+    }
+
+    @Override
+    public DataSource load(String source) {
+        final NamedUri namedUri = NamedUriStringParser.parse(source);
+        final String group = namedUri.getGroupOrElse(DEFAULT_GROUP);
+        final Charset charset = namedUri.getCharset();
+        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);
+    }
+
+}
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
new file mode 100644
index 0000000..f931474
--- /dev/null
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/loader/HttpDataSourceLoader.java
@@ -0,0 +1,68 @@
+/*
+ * 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.loader;
+
+import org.apache.freemarker.generator.base.activation.CachingUrlDataSource;
+import org.apache.freemarker.generator.base.datasource.DataSource;
+import org.apache.freemarker.generator.base.datasource.DataSourceLoader;
+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 javax.activation.URLDataSource;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
+import java.nio.charset.Charset;
+
+import static 
org.apache.freemarker.generator.base.FreeMarkerConstants.DEFAULT_GROUP;
+import static org.apache.freemarker.generator.base.util.StringUtils.isNotEmpty;
+
+public class HttpDataSourceLoader implements DataSourceLoader {
+
+    @Override
+    public boolean accept(String source) {
+        return isNotEmpty(source) && (source.startsWith("http://";) || 
source.startsWith("https://";));
+    }
+
+    @Override
+    public DataSource load(String source) {
+        final NamedUri namedUri = NamedUriStringParser.parse(source);
+        final URI uri = namedUri.getUri();
+        final String group = namedUri.getGroupOrElse(DEFAULT_GROUP);
+        final Charset charset = namedUri.getCharset();
+        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);
+    }
+
+    private static URL toUrl(URI uri) {
+        try {
+            return uri.toURL();
+        } catch (MalformedURLException e) {
+            throw new IllegalArgumentException(uri.toString(), e);
+        }
+    }
+
+    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/main/java/org/apache/freemarker/generator/base/uri/NamedUri.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/uri/NamedUri.java
index 08b7253..12445b6 100644
--- 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/uri/NamedUri.java
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/uri/NamedUri.java
@@ -16,8 +16,11 @@
  */
 package org.apache.freemarker.generator.base.uri;
 
+import org.apache.freemarker.generator.base.util.StringUtils;
+
 import java.io.File;
 import java.net.URI;
+import java.nio.charset.Charset;
 import java.util.Map;
 
 import static java.util.Objects.requireNonNull;
@@ -102,6 +105,24 @@ public class NamedUri {
         return new File(uri.getPath());
     }
 
+    public String getMimeType() {
+        return getParameter(NamedUri.MIMETYPE);
+    }
+
+    public String getMimeTypeOrElse(String def) {
+        return getParameter(NamedUri.MIMETYPE, def);
+    }
+
+    public Charset getCharset() {
+        final String charsetName = getParameter(NamedUri.CHARSET);
+        return Charset.forName(charsetName);
+    }
+
+    public Charset getCharsetOrElse(Charset def) {
+        final String charsetName = getParameter(NamedUri.CHARSET);
+        return StringUtils.isEmpty(charsetName) ? def : 
Charset.forName(charsetName);
+    }
+
     @Override
     public String toString() {
         return "NamedUri{" +
@@ -111,4 +132,5 @@ public class NamedUri {
                 ", parameters=" + parameters +
                 '}';
     }
+
 }
diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/OperatingSystem.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/OperatingSystem.java
index 2a4c84c..180b7ac 100644
--- 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/OperatingSystem.java
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/OperatingSystem.java
@@ -20,8 +20,6 @@ import java.util.Locale;
 
 /**
  * Helper class to detect the operting system (mostly Windows).
- *
- * TODO should be moved to "freemarker-generator-base"
  */
 public class OperatingSystem {
     private static final String OS = System.getProperty("os.name", 
"unknown").toLowerCase(Locale.ROOT);
diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/UriUtils.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/UriUtils.java
index b8135bb..8a6d7b9 100644
--- 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/UriUtils.java
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/UriUtils.java
@@ -77,4 +77,5 @@ public class UriUtils {
         }
         return "env".equalsIgnoreCase(uri.getScheme());
     }
+
 }

Reply via email to