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/02/03 13:19:45 UTC

[freemarker-generator] branch FREEMARKER-172 created (now fe5a971)

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

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


      at fe5a971  FREEMARKER-172 [freemarker-generator] Start with refactoring

This branch includes the following new commits:

     new fe5a971  FREEMARKER-172 [freemarker-generator] Start with refactoring

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[freemarker-generator] 01/01: FREEMARKER-172 [freemarker-generator] Start with refactoring

Posted by sg...@apache.org.
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 <si...@gmail.com>
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());
     }
+
 }