|
|
@@ -0,0 +1,107 @@
|
|
|
+/*
|
|
|
+ * @author Ranides Atterwim <ranides@gmail.com>
|
|
|
+ * @copyright Ranides Atterwim
|
|
|
+ * @license WTFPL
|
|
|
+ * @url http://ranides.net/projects/assira
|
|
|
+ */
|
|
|
+package net.ranides.assira.io.uri.impl;
|
|
|
+
|
|
|
+import java.io.File;
|
|
|
+import java.io.IOException;
|
|
|
+import java.net.URI;
|
|
|
+import java.nio.charset.Charset;
|
|
|
+import java.nio.file.Path;
|
|
|
+import java.util.Arrays;
|
|
|
+import java.util.Collection;
|
|
|
+import java.util.Optional;
|
|
|
+import java.util.zip.ZipFile;
|
|
|
+import net.ranides.assira.io.IOHandle;
|
|
|
+import net.ranides.assira.io.IOUtils;
|
|
|
+import net.ranides.assira.io.uri.URIHandle;
|
|
|
+import net.ranides.assira.io.uri.URIHandler;
|
|
|
+import net.ranides.assira.io.uri.URIResolver;
|
|
|
+import net.ranides.assira.io.uri.URIUtils;
|
|
|
+
|
|
|
+
|
|
|
+// @todo (assira #1) uri: JAR Handler
|
|
|
+public class CJarHandler implements URIHandler {
|
|
|
+
|
|
|
+ private final URIResolver resolver;
|
|
|
+
|
|
|
+ public CJarHandler() {
|
|
|
+ this.resolver = URIResolver.DEFAULT;
|
|
|
+ }
|
|
|
+
|
|
|
+ public CJarHandler(URIResolver resolver) {
|
|
|
+ this.resolver = resolver;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public URIHandle resolve(URI uri) throws IOException {
|
|
|
+ return new CJarHandle(uri);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Collection<String> schemes() {
|
|
|
+ return Arrays.asList("jar");
|
|
|
+ }
|
|
|
+
|
|
|
+ private class CJarHandle extends CHandle {
|
|
|
+
|
|
|
+ public final URI uri;
|
|
|
+// public final Path jar;
|
|
|
+ public final String file;
|
|
|
+ public final Charset charset;
|
|
|
+ public final boolean text;
|
|
|
+
|
|
|
+ public final IOHandle<ZipFile> zip;
|
|
|
+
|
|
|
+ public CJarHandle(URI uri) {
|
|
|
+ this(uri, URIUtils.getFile(uri), URIUtils.getParam(uri, "file").get(), URIUtils.getParam(uri, "charset"));
|
|
|
+ }
|
|
|
+
|
|
|
+ public CJarHandle(URI uri, File jar, String file, Optional<String> charset) {
|
|
|
+ this.uri = uri;
|
|
|
+ this.file = file;
|
|
|
+ this.charset = Charset.forName(charset.orElse("UTF-8"));
|
|
|
+ this.text = charset.isPresent();
|
|
|
+// this.istream = new IOHandle<>(() -> Files.newInputStream(path));
|
|
|
+// this.ostream = new IOHandle<>(() -> Files.newOutputStream(path));
|
|
|
+ this.zip = new IOHandle<>(() -> new ZipFile(jar));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void close() throws IOException {
|
|
|
+ try {
|
|
|
+ IOUtils.close()
|
|
|
+ .add(zip)
|
|
|
+ .close();
|
|
|
+ } finally {
|
|
|
+ super.close();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public URIResolver resolver() {
|
|
|
+ return CJarHandler.this.resolver;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String scheme() throws IOException {
|
|
|
+ return "jar";
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public URI uri() throws IOException {
|
|
|
+ return uri;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Charset charset() throws IOException {
|
|
|
+ return charset;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+}
|