jtulach@308: jtulach@308: package org.apidesign.exceptions.trycatchredo; jtulach@308: jtulach@308: import java.io.ByteArrayInputStream; jtulach@308: import java.io.ByteArrayOutputStream; jtulach@308: import java.io.IOException; jtulach@308: import java.io.InputStream; jtulach@308: import java.io.OutputStream; jtulach@308: import java.net.MalformedURLException; jtulach@308: import java.net.URL; jtulach@308: import java.net.URLConnection; jtulach@308: import java.net.URLStreamHandler; jtulach@308: import java.net.URLStreamHandlerFactory; jtulach@308: import java.util.HashMap; jtulach@308: import java.util.Map; jtulach@308: import junit.framework.Assert; jtulach@308: jtulach@308: /** jtulach@308: * jtulach@308: * @author Jaroslav Tulach jtulach@308: */ jtulach@308: public final class MemoryURL extends URLStreamHandler { jtulach@308: private MemoryURL() { jtulach@308: } jtulach@308: jtulach@308: static void initialize() { jtulach@308: } jtulach@308: static { jtulach@308: class F implements URLStreamHandlerFactory { jtulach@308: public URLStreamHandler createURLStreamHandler(String protocol) { jtulach@308: if (protocol.startsWith("memory")) { jtulach@308: return new MemoryURL(); jtulach@308: } jtulach@308: return null; jtulach@308: } jtulach@308: } jtulach@308: F f = new F(); jtulach@308: URL.setURLStreamHandlerFactory(f); jtulach@308: } jtulach@308: jtulach@308: private static Map contents = new HashMap(); jtulach@308: private static Map outputs = new HashMap(); jtulach@308: public static void registerURL(String u, String content, ByteArrayOutputStream out) throws MalformedURLException { jtulach@308: contents.put(u, new ByteArrayInputStream(content.getBytes())); jtulach@308: if (out != null) { jtulach@308: new MC(new URL(u)).out = out; jtulach@308: } jtulach@308: } jtulach@308: jtulach@308: public static byte[] getOutputForURL(String u) { jtulach@308: MC out = outputs.get(u); jtulach@308: Assert.assertNotNull("No output for " + u, out); jtulach@308: return out.out.toByteArray(); jtulach@308: } jtulach@308: jtulach@308: protected URLConnection openConnection(URL u) throws IOException { jtulach@308: return new MC(u); jtulach@308: } jtulach@308: jtulach@308: private static final class MC extends URLConnection { jtulach@308: private InputStream values; jtulach@308: private ByteArrayOutputStream out; jtulach@308: jtulach@308: public MC(URL u) { jtulach@308: super(u); jtulach@308: outputs.put(u.toExternalForm(), this); jtulach@308: } jtulach@308: jtulach@308: public void connect() throws IOException { jtulach@308: if (values != null) { jtulach@308: return; jtulach@308: } jtulach@308: values = contents.remove(url.toExternalForm()); jtulach@308: if (values == null) { jtulach@308: throw new IOException("No such content: " + url); jtulach@308: } jtulach@308: } jtulach@308: jtulach@308: @Override jtulach@308: public InputStream getInputStream() throws IOException { jtulach@308: connect(); jtulach@308: return values; jtulach@308: } jtulach@308: jtulach@308: @Override jtulach@308: public OutputStream getOutputStream() throws IOException { jtulach@308: if (out == null) { jtulach@308: out = new ByteArrayOutputStream(); jtulach@308: } jtulach@308: return out; jtulach@308: } jtulach@308: } jtulach@308: }