Просмотр исходного кода

fix: ResolveDialect.FDateTime - use GMT timezone

Ranides Atterwim 9 лет назад
Родитель
Сommit
db88da179e

+ 36 - 0
assira/src/main/java/net/ranides/assira/io/IOUtils.java

@@ -8,8 +8,11 @@ package net.ranides.assira.io;
 
 import java.io.Closeable;
 import java.io.IOException;
+import java.util.List;
 import java.util.function.Consumer;
+import net.ranides.assira.collection.lists.RTList;
 import net.ranides.assira.events.EventListener;
+import net.ranides.assira.events.Events;
 import net.ranides.assira.trace.ExceptionUtils;
 import net.ranides.assira.trace.LoggerUtils;
 
@@ -79,4 +82,37 @@ public final class IOUtils {
         }
     }
     
+    // @todo (assira #1) close-chain API
+    public static CloseFunction close() {
+        return new CloseFunction();
+    } 
+    
+    public static class CloseFunction implements AutoCloseable {
+        
+        private final List<IOException> list = new RTList<>();
+        
+        public CloseFunction add(Closeable object) {
+            IOUtils.close(object, (Consumer<Exception>)e -> list.add((IOException)e));
+            return this;
+        }
+        
+        @Override
+        public void close() throws IOException {
+            if(list.isEmpty()) {
+                return;
+            }
+            if(1 == list.size()) {
+                throw list.get(0);
+            }
+            if(1 == list.size()) {
+                IOException out = new IOException("Multiple exception thrown at #close");
+                for(Exception e : list) {
+                    out.addSuppressed(e);
+                }
+                throw out;
+            }
+        }
+        
+    }
+    
 }

+ 76 - 0
assira/src/main/java/net/ranides/assira/io/uri/impl/CClassPathHandler.java

@@ -0,0 +1,76 @@
+/*
+ * @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.IOException;
+import java.net.URI;
+import java.nio.file.Path;
+import java.util.Collection;
+import java.util.Optional;
+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: class-path Handler
+public class CClassPathHandler implements URIHandler {
+    
+    private final URIResolver resolver;
+    
+    public CClassPathHandler() {
+        this.resolver = URIResolver.DEFAULT;
+    }
+
+    public CClassPathHandler(URIResolver resolver) {
+        this.resolver = resolver;
+    }
+
+    @Override
+    public URIHandle resolve(URI uri) throws IOException {
+        return new CClassPathHandle(uri);
+    }
+
+    @Override
+    public Collection<String> schemes() {
+        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    }
+    
+    private class CClassPathHandle extends CHandle {
+        
+        public final URI uri;
+
+        public CClassPathHandle(URI uri) {
+            this(uri, URIUtils.getFile(uri).toPath(), URIUtils.getParam(uri, "charset"));
+        }
+        
+        public CClassPathHandle(Path path) {
+            this(path.toUri(), path, Optional.empty());
+        }
+        
+        public CClassPathHandle(URI uri, Path path, Optional<String> charset) {
+            this.uri = uri;
+//            this.file = path.toFile();
+//            this.path = path;
+//            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));
+        }
+
+        @Override
+        public URIResolver resolver() {
+            return CClassPathHandler.this.resolver;
+        }
+
+        @Override
+        public URI uri() throws IOException {
+            return uri;
+        }
+        
+    }
+    
+}

+ 107 - 0
assira/src/main/java/net/ranides/assira/io/uri/impl/CJarHandler.java

@@ -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;
+        }
+        
+        
+        
+    }
+}

+ 6 - 0
assira/src/main/resources/META-INF/services/net.ranides.assira.io.uri.URIHandler

@@ -0,0 +1,6 @@
+net.ranides.assira.io.uri.impl.CFileHandler
+net.ranides.assira.io.uri.impl.CFTPHandler
+net.ranides.assira.io.uri.impl.CHTTPHandler
+net.ranides.assira.io.uri.impl.CJarHandler
+net.ranides.assira.io.uri.impl.CClassPathHandler
+