package org.eck.middlewares; import java.io.IOException; import java.net.URI; import java.net.URL; import java.nio.ByteBuffer; import java.nio.channels.AsynchronousFileChannel; import java.nio.channels.CompletionHandler; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Arrays; import org.eck.LocomotiveRequestWrapper; import org.eck.LocomotiveResponseWrapper; public class LocomotiveAssetsMiddleware implements LocomotiveMiddleware { private String assetsFolder; public LocomotiveAssetsMiddleware(String assetsFolder) { super(); this.assetsFolder = assetsFolder; } @Override public void execute(LocomotiveRequestWrapper req, LocomotiveResponseWrapper resp) { try { URL resource = LocomotiveAssetsMiddleware.class.getClassLoader() .getResource(assetsFolder + req.uri()); if (resource != null) { req.processed(); URI uri = resource.toURI(); Path path = Paths.get(uri); final AsynchronousFileChannel channel = AsynchronousFileChannel .open(path); final ByteBuffer buffer = ByteBuffer.allocate(100000); channel.read(buffer, 0, buffer, new CompletionHandler<Integer, ByteBuffer>() { public void completed(Integer result, ByteBuffer attachment) { try { channel.close(); } catch (IOException e) { } resp.send(new String(Arrays.copyOf(attachment.array(), result))); } public void failed(Throwable exception, ByteBuffer attachment) { resp.status(500); resp.send(exception.getMessage()); } }); } } catch (Exception e) { throw new RuntimeException(e); } } }