FEAT 'classpath' URL handler
NClazz/resource-manager/pipeline/head This commit looks good Details

master
Niclas Thobaben 2020-12-04 21:57:46 +01:00
parent dcae632924
commit 9d55ce7392
4 changed files with 70 additions and 12 deletions

View File

@ -1,5 +1,7 @@
package de.nclazz.resources;
import de.nclazz.resources.protocol.ClasspathResourceHandler;
import de.nclazz.resources.protocol.CustomStreamHandlerFactory;
import lombok.NonNull;
import java.io.File;
@ -13,6 +15,11 @@ import static de.nclazz.commons.func.Checked.checked;
public class Resource {
static {
// TODO not really a good place here is it...
URL.setURLStreamHandlerFactory(new CustomStreamHandlerFactory("classpath", new ClasspathResourceHandler()));
}
private final Supplier<InputStream> streamSupplier;
public Resource(Supplier<InputStream> streamSupplier) {
@ -20,7 +27,7 @@ public class Resource {
}
public Optional<InputStream> getInputStream() {
if(this.streamSupplier != null) {
if (this.streamSupplier != null) {
return Optional.ofNullable(this.streamSupplier.get());
}
return Optional.empty();
@ -42,5 +49,4 @@ public class Resource {
public static Resource fromClasspath(String resourceName) { return fromStream(Resource.class.getResourceAsStream(resourceName)); }
public static Resource fromURL(@NonNull URL url) { return new Resource(checked(url::openStream)); }
}

View File

@ -0,0 +1,17 @@
package de.nclazz.resources.protocol;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLStreamHandler;
public class ClasspathResourceHandler extends URLStreamHandler {
@Override
protected URLConnection openConnection(URL u) throws IOException {
URL resourceURL = ClasspathResourceHandler.class.getResource(u.getPath());
return resourceURL.openConnection();
}
}

View File

@ -0,0 +1,25 @@
package de.nclazz.resources.protocol;
import java.net.URLStreamHandler;
import java.net.URLStreamHandlerFactory;
import java.util.HashMap;
import java.util.Map;
public class CustomStreamHandlerFactory implements URLStreamHandlerFactory {
private final Map<String, URLStreamHandler> protocolHandlers;
public CustomStreamHandlerFactory(String protocol, URLStreamHandler urlHandler) {
protocolHandlers = new HashMap<>();
addHandler(protocol, urlHandler);
}
public void addHandler(String protocol, URLStreamHandler urlHandler) {
protocolHandlers.put(protocol, urlHandler);
}
@Override
public URLStreamHandler createURLStreamHandler(String protocol) {
return protocolHandlers.get(protocol);
}
}

View File

@ -4,39 +4,49 @@ import org.junit.jupiter.api.Test;
import java.io.File;
import java.net.URL;
import java.util.Arrays;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
class ResourceTest {
@Test
void testResourceFromFile() {
Resource resource = Resource.fromFile(new File("src/test/resources/airplane.png"));
assertTrue(resource.exists());
assertTrue(resource.getInputStream().isPresent());
assertResource(resource, "from File");
}
@Test
void testResourceFromResourceStream() {
Resource resource = Resource.fromStream(ResourceTest.class.getResourceAsStream("/airplane.png"));
assertTrue(resource.exists());
assertTrue(resource.getInputStream().isPresent());
assertResource(resource, "from Stream");
}
@Test
void testResourceFromResource() {
Resource resource = Resource.fromClasspath("/airplane.png");
assertTrue(resource.exists());
assertTrue(resource.getInputStream().isPresent());
assertResource(resource, "from Resource");
}
static List<String> urls = Arrays.asList("https://homepages.cae.wisc.edu/~ece533/images/airplane.png",
"file:///" + System.getProperty("user.dir") + "/src/test/resources/airplane.png",
"classpath:/airplane.png");
@Test
void testResourceFromURL() throws Exception {
Resource resource = Resource.fromURL(new URL("https://homepages.cae.wisc.edu/~ece533/images/airplane.png"));
assertTrue(resource.exists());
assertTrue(resource.getInputStream().isPresent());
for (String url : urls) {
assertResource(Resource.fromURL(new URL(url)), url);
}
}
void assertResource(Resource resource, String message) {
assertNotNull(resource, message);
assertTrue(resource.exists(), message);
assertTrue(resource.getInputStream().isPresent(), message);
}
}