package jef.tools.resource; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.util.Collections; import java.util.Map; import jef.tools.IOUtils; public abstract class Resource{ public abstract BufferedWriter getWriter() throws IOException; public static FileResource DUMMY; static { try { URL u = new URL("file:///void"); DUMMY = new DummyResource(u); } catch (MalformedURLException e) { throw new UnsupportedOperationException(); } } public abstract boolean isWritable(); protected URL url; protected String charset; public Resource(URL url) { this.url = url; } public boolean isReadable() { return true; } public static FileResource getFileResource(URL url) { if (url == null) return DUMMY; String p = url.getProtocol(); if ("file".equals(p)) { return new FileResource(url); } else if ("jar".equals(p) || "zip".equals(p)) { return new ZipFileResource(url); } else { return new RemoteFileResource(url); } } public static Resource getResource(URL url) { if (url == null) return DUMMY; String p = url.getProtocol(); if ("file".equals(p)) { return new FileResource(url); } else if ("jar".equals(p) || "zip".equals(p)) { return new ZipResource(url); } else { return new RemoteResource(url); } } public Resource setCharset(String charset) { this.charset = charset; return this; } public URL unwrap() { return url; } public String getUrl() { return url.toString(); } public URL getURL() { return url; } public String getName() { return url.getFile(); } public InputStream openStream() { try { return url.openStream(); } catch (IOException e) { throw new RuntimeException(e); } } public BufferedReader openReader() { return IOUtils.getReader(openStream(), charset); } public String loadAsString() { try { return IOUtils.asString(openStream(), charset, true); } catch (IOException e) { throw new RuntimeException(e); } } public String loadAsString(String charset) { try { return IOUtils.asString(openStream(), charset, true); } catch (IOException e) { throw new RuntimeException(e); } } public Map<String, String> loadAsProperties() throws IOException { return IOUtils.loadProperties(openReader()); } static class ZipResource extends Resource { public ZipResource(URL url) { super(url); } public BufferedWriter getWriter() { throw new UnsupportedOperationException(); } public boolean isWritable() { return false; } } static class RemoteResource extends Resource { public RemoteResource(URL url) { super(url); } @Override public BufferedWriter getWriter() { throw new UnsupportedOperationException(); } @Override public boolean isWritable() { return false; } } } class DummyResource extends FileResource { DummyResource(URL url) { super(url); super.url = null; super.file = null; } @Override public String getName() { return null; } @Override public InputStream openStream() { return new ByteArrayInputStream(new byte[0]); } @Override public String loadAsString() { return ""; } @Override public String loadAsString(String charset) { return ""; } @Override public Map<String, String> loadAsProperties() throws IOException { return Collections.emptyMap(); } @Override public BufferedWriter getWriter() throws IOException { throw new UnsupportedOperationException(); } @Override public boolean isWritable() { return false; } @Override public boolean isReadable() { return false; } }