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 22:14:24 UTC

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

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 f66424443b62d9784491111db94b12fe0789c481
Author: Siegfried Goeschl <si...@gmail.com>
AuthorDate: Wed Feb 3 20:39:03 2021 +0100

    FREEMARKER-172 [freemarker-generator] Start with refactoring
---
 .../base/datasource/DataSourceFactory.java         | 138 ++++-----------------
 .../datasource/loader/FileDataSourceLoader.java    |   4 +-
 .../template/TemplateTransformationsBuilder.java   |   9 +-
 .../datasource/DataSourceFactoryTest.java          |  74 ++---------
 .../generator/datasource/DataSourceTest.java       |   8 +-
 .../generator/datasource/DataSourcesTest.java      |  81 +++++++-----
 6 files changed, 92 insertions(+), 222 deletions(-)

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 30e3c7a..47e5d46 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
@@ -17,15 +17,11 @@
 package org.apache.freemarker.generator.base.datasource;
 
 import org.apache.freemarker.generator.base.FreeMarkerConstants.Location;
-import org.apache.freemarker.generator.base.activation.ByteArrayDataSource;
 import org.apache.freemarker.generator.base.activation.CachingUrlDataSource;
 import org.apache.freemarker.generator.base.activation.InputStreamDataSource;
 import org.apache.freemarker.generator.base.activation.StringDataSource;
 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.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;
 
@@ -44,61 +40,26 @@ import java.util.UUID;
 
 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.mime.Mimetypes.MIME_TEXT_PLAIN;
-import static org.apache.freemarker.generator.base.util.StringUtils.firstNonEmpty;
 
 /**
- * Creates a FreeMarker data source from various sources.
+ * Low-level factory to create FreeMarker data sources.
  */
 public abstract class DataSourceFactory {
 
-    private static final String NO_MIME_TYPE = null;
-    private static final Charset NO_CHARSET = null;
-    private static final String ROOT_DIR = "/";
-
     private DataSourceFactory() {
     }
 
-    // == NamedUri ==========================================================
-
-    public static DataSource fromNamedUri(String str) {
-        Validate.notNull(str, "namedUri is null");
-
-        return fromNamedUri(NamedUriStringParser.parse(str));
-    }
+    // == General ===========================================================
 
-    public static DataSource fromNamedUri(NamedUri namedUri) {
-        Validate.notNull(namedUri, "namedUri is null");
-
-        final URI uri = namedUri.getUri();
-        final String group = namedUri.getGroupOrElse(DEFAULT_GROUP);
-        final Charset charset = getCharsetOrElse(namedUri, NO_CHARSET);
-        final String mimeType = getMimeTypeOrElse(namedUri, NO_MIME_TYPE);
-
-        if (UriUtils.isHttpUri(uri)) {
-            final URL url = toUrl(uri);
-            final String name = namedUri.getNameOrElse(UriUtils.toStringWithoutFragment(uri));
-            return fromUrl(name, group, url, mimeType, charset);
-        } else if (UriUtils.isFileUri(uri)) {
-            final File file = namedUri.getFile();
-            final String name = namedUri.getNameOrElse(UriUtils.toStringWithoutFragment(file.toURI()));
-            return fromFile(name, group, file, charset);
-        } else if (UriUtils.isEnvUri(uri)) {
-            // environment variables come with a leading "/" to be removed
-            final String key = stripRootDir(uri.getPath());
-            final String contentType = getMimeTypeOrElse(namedUri, MIME_TEXT_PLAIN);
-            final String name = firstNonEmpty(namedUri.getName(), key, Location.ENVIRONMENT);
-            if (StringUtils.isEmpty(key)) {
-                return fromEnvironment(name, group, contentType);
-            } else {
-                return fromEnvironment(name, group, key, contentType);
-            }
-        } else {
-            // handle things such as "foo=some.file"
-            final File file = namedUri.getFile();
-            final String name = namedUri.getNameOrElse(UriUtils.toStringWithoutFragment(file.toURI()));
-            return fromFile(name, group, file, charset);
-        }
+    public static DataSource create(
+            String name,
+            String group,
+            URI uri,
+            javax.activation.DataSource dataSource,
+            String contentType,
+            Charset charset
+    ) {
+        return new DataSource(name, group, uri, dataSource, contentType, charset);
     }
 
     // == URL ===============================================================
@@ -132,23 +93,16 @@ public abstract class DataSourceFactory {
         return create(name, group, file.toURI(), dataSource, contentType, charset);
     }
 
-    // == Bytes ============================================================
-
-    public static DataSource fromBytes(String name, String group, byte[] content, String contentType) {
-        final ByteArrayDataSource dataSource = new ByteArrayDataSource(name, content);
-        final URI uri = UriUtils.toUri(Location.BYTES + ":///");
-        return create(name, group, uri, dataSource, contentType, UTF_8);
-    }
-
     // == InputStream =======================================================
 
-    public static DataSource fromInputStream(String name, String group, InputStream is, String contentType, Charset charset) {
-        final InputStreamDataSource dataSource = new InputStreamDataSource(name, is);
-        final URI uri = UriUtils.toUri(Location.INPUTSTREAM + ":///");
-        return create(name, group, uri, dataSource, contentType, charset);
-    }
-
-    public static DataSource fromInputStream(String name, String group, URI uri, InputStream is, String contentType, Charset charset) {
+    public static DataSource fromInputStream(
+            String name,
+            String group,
+            URI uri,
+            InputStream is,
+            String contentType,
+            Charset charset
+    ) {
         final InputStreamDataSource dataSource = new InputStreamDataSource(name, is);
         return create(name, group, uri, dataSource, contentType, charset);
     }
@@ -176,60 +130,12 @@ public abstract class DataSourceFactory {
         return create(name, group, uri, dataSource, contentType, UTF_8);
     }
 
-    // == General ===========================================================
-
-    /**
-     * Create a data source based on a
-     * <ul>
-     *  <li>URI</li>
-     *  <li>Named URI</li>
-     *  <li>file name</li>
-     * </ul>
-     *
-     * @param source source of the data source
-     * @return DataSource
-     */
-    public static DataSource create(String source) {
-        if (UriUtils.isUri(source)) {
-            return fromNamedUri(source);
-        } else {
-            final File file = new File(source);
-            return fromFile(file.getName(), DEFAULT_GROUP, file, UTF_8);
-        }
-    }
-
-    public static DataSource create(
-            String name,
-            String group,
-            URI uri,
-            javax.activation.DataSource dataSource,
-            String contentType,
-            Charset charset) {
-        return new DataSource(name, group, uri, dataSource, contentType, charset);
-    }
-
-    private static String getMimeTypeOrElse(NamedUri namedUri, String def) {
-        return namedUri.getParameter(NamedUri.MIMETYPE, def);
-    }
-
-    private static Charset getCharsetOrElse(NamedUri namedUri, Charset def) {
-        final String charsetName = namedUri.getParameter(NamedUri.CHARSET);
-        return StringUtils.isEmpty(charsetName) ? def : Charset.forName(charsetName);
-    }
-
-    private static URL toUrl(URI uri) {
+    public static URL toUrl(String url) {
         try {
-            return uri.toURL();
+            return new URL(url);
         } catch (MalformedURLException e) {
-            throw new IllegalArgumentException(uri.toString(), e);
+            throw new IllegalArgumentException(url, e);
         }
     }
 
-    private static String stripRootDir(String str) {
-        if (str.startsWith(ROOT_DIR)) {
-            return str.substring(ROOT_DIR.length());
-        } else {
-            return str;
-        }
-    }
 }
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 fd2f576..f76cb88 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
@@ -43,7 +43,9 @@ public class FileDataSourceLoader implements DataSourceLoader {
         final String group = namedUri.getGroupOrElse(FreeMarkerConstants.DEFAULT_GROUP);
         final Charset charset = namedUri.getCharsetOrElse(UTF_8);
         final File file = namedUri.getFile();
-        final String name = namedUri.getNameOrElse(UriUtils.toStringWithoutFragment(file.toURI()));
+        // TODO
+        // final String name = namedUri.getNameOrElse(UriUtils.toStringWithoutFragment(file.toURI()));
+        final String name = namedUri.getNameOrElse(file.getName());
         return DataSourceFactory.fromFile(name, group, file, charset);
     }
 
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateTransformationsBuilder.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateTransformationsBuilder.java
index 6aaf494..c8541d8 100644
--- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateTransformationsBuilder.java
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/template/TemplateTransformationsBuilder.java
@@ -18,7 +18,8 @@ package org.apache.freemarker.generator.base.template;
 
 import org.apache.freemarker.generator.base.FreeMarkerConstants.Location;
 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.datasource.DataSourceLoaderFactory;
 import org.apache.freemarker.generator.base.file.RecursiveFileSupplier;
 import org.apache.freemarker.generator.base.util.NonClosableWriterWrapper;
 import org.apache.freemarker.generator.base.util.StringUtils;
@@ -41,6 +42,8 @@ import static java.util.Collections.singletonList;
  */
 public class TemplateTransformationsBuilder {
 
+    private final DataSourceLoader dataSourceLoader;
+
     /** Interactive template */
     private TemplateSource interactiveTemplate;
 
@@ -66,6 +69,7 @@ public class TemplateTransformationsBuilder {
     private Writer callerSuppliedWriter;
 
     private TemplateTransformationsBuilder() {
+        this.dataSourceLoader = DataSourceLoaderFactory.create();
         this.templateSource = null;
         this.includes = new ArrayList<>();
         this.excludes = new ArrayList<>();
@@ -228,7 +232,7 @@ public class TemplateTransformationsBuilder {
     }
 
     private TemplateSource templateSource(String source) {
-        try (DataSource dataSource = DataSourceFactory.create(source)) {
+        try (DataSource dataSource = dataSourceLoader.load(source)) {
             return TemplateSource.fromCode(dataSource.getName(), dataSource.getText(templateEncoding.name()));
         }
     }
@@ -300,4 +304,5 @@ public class TemplateTransformationsBuilder {
         // avoid closing System.out after rendering the template
         return new BufferedWriter(new NonClosableWriterWrapper(new OutputStreamWriter(System.out, outputEncoding)));
     }
+
 }
diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourceFactoryTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourceFactoryTest.java
index 0610e2d..85dc86c 100644
--- a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourceFactoryTest.java
+++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourceFactoryTest.java
@@ -17,10 +17,10 @@
 package org.apache.freemarker.generator.datasource;
 
 import org.apache.commons.io.FilenameUtils;
+import org.apache.freemarker.generator.base.FreeMarkerConstants.Location;
 import org.apache.freemarker.generator.base.datasource.DataSource;
 import org.apache.freemarker.generator.base.datasource.DataSourceFactory;
-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.junit.Ignore;
 import org.junit.Test;
 
@@ -28,6 +28,7 @@ import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.URI;
 import java.net.URL;
 import java.nio.charset.Charset;
 
@@ -46,7 +47,7 @@ public class DataSourceFactoryTest {
     private static final String ANY_FILE_URI = format("file:///%s/pom.xml", PWD);
     private static final Charset ANY_CHAR_SET = UTF_8;
     private static final File ANY_FILE = new File(ANY_FILE_NAME);
-    private static final String ANY_ENV_VARIABLE = "JAVA_HOME";
+    private static final String ANY_ENV_VARIABLE = "HOME";
     private static final String ANY_NAMED_URL_STRING = "content:www=https://www.google.com?foo=bar#contenttype=application/json";
 
     @Test
@@ -61,17 +62,6 @@ public class DataSourceFactoryTest {
     }
 
     @Test
-    public void shouldCreateDataSourceFromFileUri() {
-        final DataSource dataSource = DataSourceFactory.create(ANY_FILE_URI);
-
-        assertEquals(ANY_FILE_NAME, dataSource.getFileName());
-        assertEquals(UTF_8, dataSource.getCharset());
-        assertEquals(MIME_APPLICATION_XML, dataSource.getContentType());
-        assertEquals(ANY_FILE.toURI(), dataSource.getUri());
-        assertTrue(!dataSource.getLines().isEmpty());
-    }
-
-    @Test
     public void shouldCreateDataSourceFromString() {
         final DataSource dataSource = DataSourceFactory.fromString("test.txt", "default", ANY_TEXT, "text/plain");
 
@@ -85,22 +75,10 @@ public class DataSourceFactoryTest {
     }
 
     @Test
-    public void shouldCreateDataSourceFromBytes() {
-        final DataSource dataSource = DataSourceFactory.fromBytes("test.txt", "default", ANY_TEXT.getBytes(UTF_8), "text/plain");
-
-        assertEquals("test.txt", dataSource.getName());
-        assertEquals("default", dataSource.getGroup());
-        assertEquals(UTF_8, dataSource.getCharset());
-        assertEquals("text/plain", dataSource.getContentType());
-        assertTrue(dataSource.getUri().toString().startsWith("bytes:///"));
-        assertEquals(ANY_TEXT, dataSource.getText());
-        assertEquals(1, dataSource.getLines().size());
-    }
-
-    @Test
     public void shouldCreateDataSourceFromInputStream() {
+        final URI uri = UriUtils.toUri(Location.INPUTSTREAM + ":///");
         final InputStream is = new ByteArrayInputStream(ANY_TEXT.getBytes(UTF_8));
-        final DataSource dataSource = DataSourceFactory.fromInputStream("test.txt", "default", is, "text/plain", UTF_8);
+        final DataSource dataSource = DataSourceFactory.fromInputStream("test.txt", "default", uri, is, "text/plain", UTF_8);
 
         assertEquals("test.txt", dataSource.getName());
         assertEquals(UTF_8, dataSource.getCharset());
@@ -116,26 +94,14 @@ public class DataSourceFactoryTest {
         final DataSource dataSource = DataSourceFactory.fromUrl("jsonplaceholder.typicode.com", "default", url, null, null);
 
         assertEquals("jsonplaceholder.typicode.com", dataSource.getName());
+        assertEquals("jsonplaceholder.typicode.com", dataSource.getFileName());
         assertEquals("application/json", dataSource.getContentType());
         assertEquals(UTF_8, dataSource.getCharset());
     }
 
     @Test
-    @Ignore
-    public void shouldCreateDataSourceFromNamedURL() {
-        final NamedUri namedUri = NamedUriStringParser.parse(ANY_NAMED_URL_STRING);
-        final DataSource dataSource = DataSourceFactory.fromNamedUri(namedUri);
-
-        assertEquals(namedUri.getName(), dataSource.getName());
-        assertEquals(namedUri.getGroup(), dataSource.getGroup());
-        assertEquals("ISO-8859-1", dataSource.getCharset().toString());
-        assertEquals(namedUri.getUri().toString(), dataSource.getUri().toString());
-    }
-
-    @Test
     public void shouldCreateDataSourceFromEnvironment() {
-        final NamedUri namedUri = NamedUriStringParser.parse("env:///");
-        final DataSource dataSource = DataSourceFactory.fromNamedUri(namedUri);
+        final DataSource dataSource = DataSourceFactory.fromEnvironment("env", "default", "text/plain");
 
         assertEquals("env", dataSource.getName());
         assertEquals("default", dataSource.getGroup());
@@ -144,28 +110,4 @@ public class DataSourceFactoryTest {
         assertEquals("text/plain", dataSource.getContentType());
     }
 
-    @Test
-    public void shouldCreateDataSourceFromNamedEnvironment() {
-        final NamedUri namedUri = NamedUriStringParser.parse("config=env:///");
-        final DataSource dataSource = DataSourceFactory.fromNamedUri(namedUri);
-
-        assertEquals("config", dataSource.getName());
-        assertEquals("default", dataSource.getGroup());
-        assertEquals(UTF_8, dataSource.getCharset());
-        assertEquals("env:///", dataSource.getUri().toString());
-        assertEquals("text/plain", dataSource.getContentType());
-    }
-
-    @Test
-    public void shouldCreateDataSourceFromEnvironmentVariable() {
-        final String uri = "env:///" + ANY_ENV_VARIABLE;
-        final NamedUri namedUri = NamedUriStringParser.parse("myenv=" + uri);
-        final DataSource dataSource = DataSourceFactory.fromNamedUri(namedUri);
-
-        assertEquals("myenv", dataSource.getName());
-        assertEquals("default", dataSource.getGroup());
-        assertEquals(UTF_8, dataSource.getCharset());
-        assertEquals(uri, dataSource.getUri().toString());
-        assertEquals("text/plain", dataSource.getContentType());
-    }
 }
diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourceTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourceTest.java
index 155b778..3f26014 100644
--- a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourceTest.java
+++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourceTest.java
@@ -20,7 +20,6 @@ import org.apache.commons.io.LineIterator;
 import org.apache.freemarker.generator.base.datasource.DataSource;
 import org.apache.freemarker.generator.base.datasource.DataSourceFactory;
 import org.apache.freemarker.generator.base.mime.Mimetypes;
-import org.junit.Ignore;
 import org.junit.Test;
 
 import java.io.Closeable;
@@ -31,6 +30,7 @@ import java.util.Iterator;
 
 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.datasource.DataSourceFactory.toUrl;
 import static org.apache.freemarker.generator.base.mime.Mimetypes.MIME_TEXT_HTML;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -80,10 +80,10 @@ public class DataSourceTest {
         }
     }
 
-    @Ignore("Requires internet connection")
+    // @Ignore("Requires internet connection")
     @Test
     public void shouldSupportUrlDataSource() {
-        try (DataSource dataSource = DataSourceFactory.create("https://www.google.com/?foo=bar")) {
+        try (DataSource dataSource = DataSourceFactory.fromUrl("www.google.com", DEFAULT_GROUP, toUrl("https://www.google.com/?foo=bar"), null, null)) {
             assertEquals("www.google.com", dataSource.getName());
             assertEquals(DEFAULT_GROUP, dataSource.getGroup());
             assertEquals("www.google", dataSource.getBaseName());
@@ -157,5 +157,7 @@ public class DataSourceTest {
         public boolean isClosed() {
             return closed;
         }
+
     }
+
 }
diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesTest.java
index d3cdf45..a8659dc 100644
--- a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesTest.java
+++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesTest.java
@@ -22,6 +22,8 @@ import org.apache.freemarker.generator.base.datasource.DataSources;
 import org.junit.Test;
 
 import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static java.util.Arrays.asList;
@@ -43,37 +45,38 @@ public class DataSourcesTest {
 
     @Test
     public void shouldFindByName() {
-        final DataSources dataSources = dataSources();
-
-        assertEquals(0, dataSources.find(null).size());
-        assertEquals(0, dataSources.find("").size());
-        assertEquals(0, dataSources.find("*.bar").size());
-        assertEquals(0, dataSources.find("foo.*").size());
-        assertEquals(0, dataSources.find("foo.bar").size());
-
-        assertEquals(2, dataSources.find("*.*").size());
-        assertEquals(1, dataSources.find("*." + ANY_FILE_EXTENSION).size());
-        assertEquals(1, dataSources.find("*/*." + ANY_FILE_EXTENSION).size());
-        assertEquals(1, dataSources.find("*.???").size());
-        assertEquals(1, dataSources.find("*om*").size());
-        assertEquals(1, dataSources.find("*o*.xml").size());
-
-        assertEquals(3, dataSources.find("*").size());
+        try (DataSources dataSources = dataSources()) {
+            assertEquals(0, dataSources.find(null).size());
+            assertEquals(0, dataSources.find("").size());
+            assertEquals(0, dataSources.find("*.bar").size());
+            assertEquals(0, dataSources.find("foo.*").size());
+            assertEquals(0, dataSources.find("foo.bar").size());
+
+            assertEquals(2, dataSources.find("*.*").size());
+            assertEquals(1, dataSources.find("*." + ANY_FILE_EXTENSION).size());
+            assertEquals(1, dataSources.find("*/*." + ANY_FILE_EXTENSION).size());
+            assertEquals(1, dataSources.find("*.???").size());
+            assertEquals(1, dataSources.find("*om*").size());
+            assertEquals(1, dataSources.find("*o*.xml").size());
+
+            assertEquals(3, dataSources.find("*").size());
+        }
     }
 
     @Test
     public void shouldFindByGroupPart() {
-        final DataSources dataSources = dataSources();
+        try (DataSources dataSources = dataSources()) {
 
-        assertEquals(0, dataSources.find(GROUP_PART, null).size());
-        assertEquals(0, dataSources.find(GROUP_PART, "").size());
+            assertEquals(0, dataSources.find(GROUP_PART, null).size());
+            assertEquals(0, dataSources.find(GROUP_PART, "").size());
 
-        assertEquals(0, dataSources.find(GROUP_PART, "unknown").size());
+            assertEquals(0, dataSources.find(GROUP_PART, "unknown").size());
 
-        assertEquals(3, dataSources.find(GROUP_PART, "*").size());
-        assertEquals(3, dataSources.find(GROUP_PART, "default").size());
-        assertEquals(3, dataSources.find(GROUP_PART, "d*").size());
-        assertEquals(3, dataSources.find(GROUP_PART, "d??????").size());
+            assertEquals(3, dataSources.find(GROUP_PART, "*").size());
+            assertEquals(3, dataSources.find(GROUP_PART, "default").size());
+            assertEquals(3, dataSources.find(GROUP_PART, "d*").size());
+            assertEquals(3, dataSources.find(GROUP_PART, "d??????").size());
+        }
 
     }
 
@@ -84,15 +87,16 @@ public class DataSourcesTest {
 
     @Test
     public void shouldGetAllDataSource() {
-        final DataSources dataSources = dataSources();
-
-        assertEquals("unknown", dataSources.get(0).getFileName());
-        assertEquals("pom.xml", dataSources.get(1).getFileName());
-        assertEquals("server.invalid?foo=bar", dataSources.get(2).getFileName());
-        assertEquals(3, dataSources.toList().size());
-        assertEquals(3, dataSources.toMap().size());
-        assertEquals(3, dataSources.size());
-        assertFalse(dataSources.isEmpty());
+        try (DataSources dataSources = dataSources()) {
+
+            assertEquals("unknown", dataSources.get(0).getFileName());
+            assertEquals("pom.xml", dataSources.get(1).getFileName());
+            assertEquals("server.invalid?foo=bar", dataSources.get(2).getFileName());
+            assertEquals(3, dataSources.toList().size());
+            assertEquals(3, dataSources.toMap().size());
+            assertEquals(3, dataSources.size());
+            assertFalse(dataSources.isEmpty());
+        }
     }
 
     @Test
@@ -133,6 +137,15 @@ public class DataSourcesTest {
     }
 
     private static DataSource urlDataSource() {
-        return DataSourceFactory.create(ANY_URL);
+        return DataSourceFactory.fromUrl("server.invalid?foo=bar", "default", toUrl(ANY_URL), "plain/text", UTF_8);
     }
+
+    private static URL toUrl(String value) {
+        try {
+            return new URL(value);
+        } catch (MalformedURLException e) {
+            throw new RuntimeException("Failed to create URL:" + value, e);
+        }
+    }
+
 }