Skip to content
This repository was archived by the owner on Dec 8, 2022. It is now read-only.

Commit

Permalink
ClasspathResource relative to ClassLoader (#53)
Browse files Browse the repository at this point in the history
ClasspathResource can be relative to class or relative to explicit classloader.
The default behaviour for the AnyResource is the current threads classloader.

fixes #48
  • Loading branch information
keykey7 authored Feb 8, 2021
1 parent 09990bc commit ea5c8f6
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import ch.kk7.confij.source.any.ConfijAnyResource;
import ch.kk7.confij.template.ValueResolver.StringResolver;
import com.google.auto.service.AutoService;
import lombok.AccessLevel;
import lombok.NonNull;
import lombok.ToString;
import lombok.Value;
Expand All @@ -23,27 +24,49 @@ public class ClasspathResource implements ConfijResource {
@NonNull String nameTemplate;
@With
@NonNull String charsetTemplate;
@With
Class<?> classloaderOf;
@With(AccessLevel.PROTECTED)
Class<?> relativeClass;
@With(AccessLevel.PROTECTED)
ClassLoader relativeClassLoader;

public ClasspathResource relativeTo(ClassLoader relativeClassLoader) {
return withRelativeClassLoader(relativeClassLoader);
}

public ClasspathResource relativeTo(Class<?> relativeClass) {
return withRelativeClass(relativeClass);
}

/**
* @deprecated use {@link #relativeTo(Class)} instead
*/
@Deprecated
public ClasspathResource withClassloaderOf(Class<?> relativeClass) {
return relativeTo(relativeClass);
}

public ClasspathResource withCharset(Charset charset) {
return withCharsetTemplate(charset.name());
}

public static ClasspathResource ofName(String nameTemplate) {
return new ClasspathResource(nameTemplate, Defaults.CHARSET_NAME, null);
return new ClasspathResource(nameTemplate, Defaults.CHARSET_NAME, null, Thread.currentThread()
.getContextClassLoader());
}

@NonNull
protected URL asUrl(String name) {
final URL url;
if (classloaderOf == null) {
url = ClassLoader.getSystemResource(name);
} else {
url = classloaderOf.getResource(name);
if (relativeClass != null) {
url = relativeClass.getResource(name);
if (url == null) {
throw unableToFetch(name, "no such file on classpath relative to class " + relativeClass.getName());
}
return url;
}
url = relativeClassLoader.getResource(name);
if (url == null) {
throw unableToFetch(name, "no such file on classpath");
throw unableToFetch(name, "no such file on classpath of classloader" + relativeClassLoader);
}
return url;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,12 @@ public void rootName() {
.element(0)
.extracting(ResourceContent::getContent)
.isEqualTo("111\n");
assertThat(ClasspathResource.ofName("file1.txt")
.relativeTo(ClassLoader.getSystemClassLoader())
.read()).hasSize(1)
.element(0)
.extracting(ResourceContent::getContent)
.isEqualTo("111\n");
assertThat(ClasspathResource.ofName("ch/kk7/confij/source/resource/file2.txt")
.read()).hasSize(1)
.element(0)
Expand All @@ -24,13 +30,13 @@ public void rootName() {
@Test
public void relativeToClass() {
assertThat(ClasspathResource.ofName("/file1.txt")
.withClassloaderOf(ClasspathResource.class)
.relativeTo(ClasspathResource.class)
.read()).hasSize(1)
.element(0)
.extracting(ResourceContent::getContent)
.isEqualTo("111\n");
assertThat(ClasspathResource.ofName("file2.txt")
.withClassloaderOf(ClasspathResource.class)
.relativeTo(ClasspathResource.class)
.read()).hasSize(1)
.element(0)
.extracting(ResourceContent::getContent)
Expand Down

0 comments on commit ea5c8f6

Please sign in to comment.