ResourceBasedFxmlLoadingConfiguration.java
/**
* Copyright (c) 2018 European Organisation for Nuclear Research (CERN), All Rights Reserved.
*/
package org.minifx.fxmlloading.configuration.impl;
import static java.util.Objects.requireNonNull;
import java.net.URL;
import org.minifx.fxmlloading.configuration.FxmlLoadingConfiguration;
public class ResourceBasedFxmlLoadingConfiguration implements FxmlLoadingConfiguration {
private static final String CSS_SUFFIX = ".css";
private static final String FXML_SUFFIX = ".fxml";
private final String fullFxmlResourceName;
private ResourceBasedFxmlLoadingConfiguration(String fullyQualifiedFxmlName) {
this.fullFxmlResourceName = requireNonNull(fullyQualifiedFxmlName);
if (this.fullFxmlResourceName.isEmpty()) {
throw new IllegalArgumentException("resource name must not be empty.");
}
if (!this.fullFxmlResourceName.endsWith(FXML_SUFFIX)) {
throw new IllegalArgumentException("resource name must end in '" + FXML_SUFFIX
+ "'. This is not the case for given name '" + fullyQualifiedFxmlName + "'.");
}
assertFullyQualified(fullFxmlResourceName);
}
@Override
public URL fxmlResource() {
return getFullyQualifiedResource(fullFxmlResourceName);
}
@Override
public URL cssResource() {
return getFullyQualifiedResource(cssResourceName());
}
/* Visible for testing */
String cssResourceName() {
return fullFxmlResourceName.substring(0, fullFxmlResourceName.length() - FXML_SUFFIX.length()) + CSS_SUFFIX;
}
private URL getFullyQualifiedResource(String name) {
assertFullyQualified(name);
return ResourceBasedFxmlLoadingConfiguration.class.getResource(name);
}
@Override
public String toString() {
return "ResourceBasedFxmlLoadingConfiguration [fullFxmlResourceName=" + fullFxmlResourceName + "]";
}
private static void assertFullyQualified(String name) {
if (!name.startsWith("/")) {
throw new IllegalArgumentException(
"resource name must be fully qualified (start with '/') . This is not the case for given name '"
+ name + "'.");
}
}
public static ResourceBasedFxmlLoadingConfiguration fromFxml(String fullyQualifiedResourceName) {
return new ResourceBasedFxmlLoadingConfiguration(fullyQualifiedResourceName);
}
@Override
public String conventionalName() {
return simpleFileName().replaceAll(FXML_SUFFIX, "");
}
private String simpleFileName() {
int lastSlash = fullFxmlResourceName.lastIndexOf('/');
return fullFxmlResourceName.substring(lastSlash + 1);
}
@Override
public String packageName() {
return fullFxmlResourceName.substring(1, fullFxmlResourceName.length() - simpleFileName().length() - 1)
.replace('/', '.');
}
}