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()); } + }
