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