/*
* Copyright (c) 2014 tabletoptool.com team.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
*
* Contributors:
* rptools.com team - initial implementation
* tabletoptool.com team - further development
*/
package com.t3.net;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLStreamHandler;
import java.net.URLStreamHandlerFactory;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.io.IOUtils;
public class RPTURLStreamHandlerFactory implements URLStreamHandlerFactory {
private static Map<String, byte[]> imageMap = new HashMap<String, byte[]>();
private Map<String, URLStreamHandler> protocolMap = new HashMap<String, URLStreamHandler>();
public RPTURLStreamHandlerFactory() {
registerProtocol("cp", new ClasspathStreamHandler());
}
public void registerProtocol(String protocol, URLStreamHandler handler) {
protocolMap.put(protocol, handler);
}
@Override
public URLStreamHandler createURLStreamHandler(String protocol) {
return protocolMap.get(protocol);
}
private static class ClasspathStreamHandler extends URLStreamHandler {
@Override
protected URLConnection openConnection(URL u) throws IOException {
// TODO: This should really figure out the exact type
return new ImageURLConnection(u);
}
}
private static class ImageURLConnection extends URLConnection {
private byte[] data;
public ImageURLConnection(URL url) {
super(url);
String path = url.getHost() + url.getFile();
data = imageMap.get(path);
if (data == null) {
try(InputStream in=RPTURLStreamHandlerFactory.class.getClassLoader().getResourceAsStream(path)) {
data = IOUtils.toByteArray(in);
imageMap.put(path, data);
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
@Override
public void connect() throws IOException {
// Nothing to do
}
@Override
public InputStream getInputStream() throws IOException {
return new ByteArrayInputStream(data);
}
}
}