com.t3.net.RPTURLStreamHandlerFactory.java Source code

Java tutorial

Introduction

Here is the source code for com.t3.net.RPTURLStreamHandlerFactory.java

Source

/*
 * 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);
        }
    }
}