package io.dropwizard.assets;
import io.dropwizard.Bundle;
import io.dropwizard.servlets.assets.AssetServlet;
import io.dropwizard.setup.Bootstrap;
import io.dropwizard.setup.Environment;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.nio.charset.StandardCharsets;
import static com.google.common.base.Preconditions.checkArgument;
A bundle for serving static asset files from the classpath.
/**
* A bundle for serving static asset files from the classpath.
*/
public class AssetsBundle implements Bundle {
private static final Logger LOGGER = LoggerFactory.getLogger(AssetsBundle.class);
private static final String DEFAULT_ASSETS_NAME = "assets";
private static final String DEFAULT_INDEX_FILE = "index.htm";
private static final String DEFAULT_PATH = "/assets";
private final String resourcePath;
private final String uriPath;
private final String indexFile;
private final String assetsName;
Creates a new AssetsBundle which serves up static assets from src/main/resources/assets/*
as /assets/*
. See Also:
/**
* Creates a new AssetsBundle which serves up static assets from
* {@code src/main/resources/assets/*} as {@code /assets/*}.
*
* @see AssetsBundle#AssetsBundle(String, String, String)
*/
public AssetsBundle() {
this(DEFAULT_PATH, DEFAULT_PATH, DEFAULT_INDEX_FILE, DEFAULT_ASSETS_NAME);
}
Creates a new AssetsBundle which will configure the application to serve the static files located in src/main/resources/${path}
as /${path}
. For example, given a path
of "/assets"
, src/main/resources/assets/example.js
would be served up from /assets/example.js
. Params: - path – the classpath and URI root of the static asset files
See Also:
/**
* Creates a new AssetsBundle which will configure the application to serve the static files
* located in {@code src/main/resources/${path}} as {@code /${path}}. For example, given a
* {@code path} of {@code "/assets"}, {@code src/main/resources/assets/example.js} would be
* served up from {@code /assets/example.js}.
*
* @param path the classpath and URI root of the static asset files
* @see AssetsBundle#AssetsBundle(String, String, String)
*/
public AssetsBundle(String path) {
this(path, path, DEFAULT_INDEX_FILE, DEFAULT_ASSETS_NAME);
}
Creates a new AssetsBundle which will configure the application to serve the static files located in src/main/resources/${resourcePath}
as /${uriPath}
. For example, given a resourcePath
of "/assets"
and a uriPath of "/js"
, src/main/resources/assets/example.js
would be served up from /js/example.js
. Params: - resourcePath – the resource path (in the classpath) of the static asset files
- uriPath – the uri path for the static asset files
See Also:
/**
* Creates a new AssetsBundle which will configure the application to serve the static files
* located in {@code src/main/resources/${resourcePath}} as {@code /${uriPath}}. For example, given a
* {@code resourcePath} of {@code "/assets"} and a uriPath of {@code "/js"},
* {@code src/main/resources/assets/example.js} would be served up from {@code /js/example.js}.
*
* @param resourcePath the resource path (in the classpath) of the static asset files
* @param uriPath the uri path for the static asset files
* @see AssetsBundle#AssetsBundle(String, String, String)
*/
public AssetsBundle(String resourcePath, String uriPath) {
this(resourcePath, uriPath, DEFAULT_INDEX_FILE, DEFAULT_ASSETS_NAME);
}
Creates a new AssetsBundle which will configure the application to serve the static files located in src/main/resources/${resourcePath}
as /${uriPath}
. If no file name is in ${uriPath}, ${indexFile} is appended before serving. For example, given a resourcePath
of "/assets"
and a uriPath of "/js"
, src/main/resources/assets/example.js
would be served up from /js/example.js
. Params: - resourcePath – the resource path (in the classpath) of the static asset files
- uriPath – the uri path for the static asset files
- indexFile – the name of the index file to use
/**
* Creates a new AssetsBundle which will configure the application to serve the static files
* located in {@code src/main/resources/${resourcePath}} as {@code /${uriPath}}. If no file name is
* in ${uriPath}, ${indexFile} is appended before serving. For example, given a
* {@code resourcePath} of {@code "/assets"} and a uriPath of {@code "/js"},
* {@code src/main/resources/assets/example.js} would be served up from {@code /js/example.js}.
*
* @param resourcePath the resource path (in the classpath) of the static asset files
* @param uriPath the uri path for the static asset files
* @param indexFile the name of the index file to use
*/
public AssetsBundle(String resourcePath, String uriPath, String indexFile) {
this(resourcePath, uriPath, indexFile, DEFAULT_ASSETS_NAME);
}
Creates a new AssetsBundle which will configure the application to serve the static files located in src/main/resources/${resourcePath}
as /${uriPath}
. If no file name is in ${uriPath}, ${indexFile} is appended before serving. For example, given a resourcePath
of "/assets"
and a uriPath of "/js"
, src/main/resources/assets/example.js
would be served up from /js/example.js
. Params: - resourcePath – the resource path (in the classpath) of the static asset files
- uriPath – the uri path for the static asset files
- indexFile – the name of the index file to use
- assetsName – the name of servlet mapping used for this assets bundle
/**
* Creates a new AssetsBundle which will configure the application to serve the static files
* located in {@code src/main/resources/${resourcePath}} as {@code /${uriPath}}. If no file name is
* in ${uriPath}, ${indexFile} is appended before serving. For example, given a
* {@code resourcePath} of {@code "/assets"} and a uriPath of {@code "/js"},
* {@code src/main/resources/assets/example.js} would be served up from {@code /js/example.js}.
*
* @param resourcePath the resource path (in the classpath) of the static asset files
* @param uriPath the uri path for the static asset files
* @param indexFile the name of the index file to use
* @param assetsName the name of servlet mapping used for this assets bundle
*/
public AssetsBundle(String resourcePath, String uriPath, String indexFile, String assetsName) {
checkArgument(resourcePath.startsWith("/"), "%s is not an absolute path", resourcePath);
checkArgument(!"/".equals(resourcePath), "%s is the classpath root", resourcePath);
this.resourcePath = resourcePath.endsWith("/") ? resourcePath : (resourcePath + '/');
this.uriPath = uriPath.endsWith("/") ? uriPath : (uriPath + '/');
this.indexFile = indexFile;
this.assetsName = assetsName;
}
@Override
public void initialize(Bootstrap<?> bootstrap) {
// nothing doing
}
@Override
public void run(Environment environment) {
LOGGER.info("Registering AssetBundle with name: {} for path {}", assetsName, uriPath + '*');
environment.servlets().addServlet(assetsName, createServlet()).addMapping(uriPath + '*');
}
public String getResourcePath() {
return resourcePath;
}
public String getUriPath() {
return uriPath;
}
public String getIndexFile() {
return indexFile;
}
protected AssetServlet createServlet() {
return new AssetServlet(resourcePath, uriPath, indexFile, StandardCharsets.UTF_8);
}
}