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