samples/trycatchredo/src/org/apidesign/exceptions/trycatchredo/usage/MemoryURL.java
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/samples/trycatchredo/src/org/apidesign/exceptions/trycatchredo/usage/MemoryURL.java Sun Feb 01 16:29:46 2009 +0100
1.3 @@ -0,0 +1,94 @@
1.4 +
1.5 +package org.apidesign.exceptions.trycatchredo.usage;
1.6 +
1.7 +import java.io.ByteArrayInputStream;
1.8 +import java.io.ByteArrayOutputStream;
1.9 +import java.io.IOException;
1.10 +import java.io.InputStream;
1.11 +import java.io.OutputStream;
1.12 +import java.net.MalformedURLException;
1.13 +import java.net.URL;
1.14 +import java.net.URLConnection;
1.15 +import java.net.URLStreamHandler;
1.16 +import java.net.URLStreamHandlerFactory;
1.17 +import java.util.HashMap;
1.18 +import java.util.Map;
1.19 +
1.20 +/** Support for special "memory://" URLs. Useful when testing network communication.
1.21 + *
1.22 + * @author Jaroslav Tulach
1.23 + */
1.24 +public final class MemoryURL extends URLStreamHandler {
1.25 + private MemoryURL() {
1.26 + }
1.27 +
1.28 + public static void initialize() {
1.29 + }
1.30 + static {
1.31 + class F implements URLStreamHandlerFactory {
1.32 + public URLStreamHandler createURLStreamHandler(String protocol) {
1.33 + if (protocol.startsWith("memory")) {
1.34 + return new MemoryURL();
1.35 + }
1.36 + return null;
1.37 + }
1.38 + }
1.39 + F f = new F();
1.40 + URL.setURLStreamHandlerFactory(f);
1.41 + }
1.42 +
1.43 + private static Map<String,InputStream> contents = new HashMap<String,InputStream>();
1.44 + private static Map<String,OutputStream> outputs = new HashMap<String,OutputStream>();
1.45 +
1.46 + public static void registerURL(String u, String content, OutputStream out) throws MalformedURLException {
1.47 + contents.put(u, new ByteArrayInputStream(content.getBytes()));
1.48 + outputs.put(u, out);
1.49 + }
1.50 +
1.51 + public static String getOutputForURL(String u) {
1.52 + OutputStream out = outputs.get(u);
1.53 + return out.toString();
1.54 + }
1.55 +
1.56 + protected URLConnection openConnection(URL u) throws IOException {
1.57 + return new MC(u);
1.58 + }
1.59 +
1.60 + private static final class MC extends URLConnection {
1.61 + private InputStream values;
1.62 + private OutputStream out;
1.63 +
1.64 + public MC(URL u) {
1.65 + super(u);
1.66 + out = outputs.get(u.toExternalForm());
1.67 + if (out == null) {
1.68 + out = new ByteArrayOutputStream();
1.69 + outputs.put(u.toExternalForm(), out);
1.70 + }
1.71 + }
1.72 +
1.73 + public void connect() throws IOException {
1.74 + if (values != null) {
1.75 + return;
1.76 + }
1.77 + values = contents.remove(url.toExternalForm());
1.78 + if (values == null) {
1.79 + throw new IOException("No such content: " + url);
1.80 + }
1.81 + }
1.82 +
1.83 + @Override
1.84 + public InputStream getInputStream() throws IOException {
1.85 + connect();
1.86 + return values;
1.87 + }
1.88 +
1.89 + @Override
1.90 + public OutputStream getOutputStream() throws IOException {
1.91 + if (out == null) {
1.92 + out = new ByteArrayOutputStream();
1.93 + }
1.94 + return out;
1.95 + }
1.96 + }
1.97 +}