Explorar el Código

URIHandlers: file & http

Ranides Atterwim hace 10 años
padre
commit
0f81975e8b

+ 13 - 45
assira/src/main/java/net/ranides/assira/io/uri/impl/CFileHandler.java

@@ -9,11 +9,7 @@ package net.ranides.assira.io.uri.impl;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.InputStreamReader;
 import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.Reader;
-import java.io.Writer;
 import java.net.URI;
 import java.nio.charset.Charset;
 import java.nio.file.Files;
@@ -25,18 +21,16 @@ import java.util.Optional;
 import java.util.Set;
 import net.ranides.assira.collection.query.CQuery;
 import net.ranides.assira.collection.query.CQueryBuilder;
-import net.ranides.assira.io.IOStreams;
 import net.ranides.assira.io.uri.URITime;
 import net.ranides.assira.io.uri.URIFlags;
 import net.ranides.assira.io.uri.URIHandle;
-import net.ranides.assira.io.uri.URIHandler;
 import net.ranides.assira.io.uri.URIUtils;
 
 /**
  *
  * @author Ranides Atterwim <ranides@gmail.com>
  */
-public class CFileHandler implements URIHandler {
+public class CFileHandler extends CHandler {
     
     final static CFileHandler THAT = new CFileHandler();
 
@@ -72,7 +66,7 @@ public class CFileHandler implements URIHandler {
 
     @Override
     public Set<URIFlags> flags(URIHandle ustream) throws IOException {
-        BasicFileAttributes attr = Files.readAttributes(ustream.path(), BasicFileAttributes.class);
+        BasicFileAttributes attr = Files.readAttributes(path(ustream), BasicFileAttributes.class);
         Set<URIFlags> flags = URIFlags.collect();
         
         if(attr.isDirectory()) {
@@ -102,7 +96,7 @@ public class CFileHandler implements URIHandler {
 
     @Override
     public Instant time(URIHandle ustream, URITime ut) throws IOException {
-        BasicFileAttributes attr = Files.readAttributes(ustream.path(), BasicFileAttributes.class);
+        BasicFileAttributes attr = Files.readAttributes(path(ustream), BasicFileAttributes.class);
         switch(ut) {
             case ACCESSED:
                 return attr.lastAccessTime().toInstant();
@@ -119,76 +113,50 @@ public class CFileHandler implements URIHandler {
 
     @Override
     public long size(URIHandle ustream) throws IOException {
-        return Files.size(ustream.path());
+        return Files.size(path(ustream));
     }
 
     @Override
     public URIHandle parent(URIHandle ustream) throws IOException {
-        return new CFileHandle(ustream.path().getParent());
+        return new CFileHandle(path(ustream).getParent());
     }
 
     @Override
     public CQuery<URIHandle> scan(URIHandle ustream) throws IOException {
-        Path up = ustream.path();
-        return CQueryBuilder.fromStream(() -> Files.list(up).map(CFileHandle::new));
+        return CQueryBuilder.fromStream(() -> Files.list(path(ustream)).map(CFileHandle::new));
     }
 
     @Override
     public InputStream istream(URIHandle ustream) throws IOException {
-        return Files.newInputStream(ustream.path());
+        return Files.newInputStream(path(ustream));
     }
     
-    @Override
-    public InputStream istream(URIHandle ustream, long begin, long end) throws IOException {
-        // @todo (assira #1) CFileHandler: istream(offset)
-        throw new UnsupportedOperationException("Not supported yet.");
-    }
-
     @Override
     public OutputStream ostream(URIHandle ustream) throws IOException {
-        return Files.newOutputStream(ustream.path());
-    }
-
-    @Override
-    public Reader reader(URIHandle ustream, Charset cs) throws IOException {
-        return new InputStreamReader(ustream.istream(), cs);
-    }
-
-    @Override
-    public Writer writer(URIHandle ustream, Charset cs) throws IOException {
-        return new OutputStreamWriter(ustream.ostream(), cs);
+        return Files.newOutputStream(path(ustream));
     }
 
     @Override
     public void delete(URIHandle ustream) throws IOException {
-        assert ustream instanceof CFileHandle;
-        Files.delete(ustream.path());
+        Files.delete(path(ustream));
     }
 
     @Override
     public void create(URIHandle ustream) throws IOException {
-        assert ustream instanceof CFileHandle;
-        Files.createFile(ustream.path());
+        Files.createFile(path(ustream));
     }
 
     @Override
     public void move(URIHandle ustream, URIHandle location) throws IOException {
-        assert ustream instanceof CFileHandle;
-        assert location instanceof CFileHandle;
-        Files.move(ustream.path(), location.path());
+        Files.move(path(ustream), location.path());
     }
 
     @Override
     public void copy(URIHandle ustream, URIHandle location) throws IOException {
-        assert ustream instanceof CFileHandle;
         if(location instanceof CFileHandle) {
-            Files.copy(ustream.path(), location.path(), StandardCopyOption.COPY_ATTRIBUTES);
+            Files.copy(path(ustream), path(location), StandardCopyOption.COPY_ATTRIBUTES);
         } else {
-            try(InputStream istream = ustream.istream()) {
-                try(OutputStream ostream = location.ostream()) {
-                    IOStreams.copy(istream, ostream);
-                }
-            } 
+            super.copy(ustream, location);
         }
     }
     

+ 151 - 0
assira/src/main/java/net/ranides/assira/io/uri/impl/CHandler.java

@@ -0,0 +1,151 @@
+/*
+ * @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.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Reader;
+import java.io.Writer;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
+import java.nio.charset.Charset;
+import java.nio.file.Path;
+import java.time.Instant;
+import java.util.Date;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import net.ranides.assira.collection.query.CQuery;
+import net.ranides.assira.io.IOStreams;
+import net.ranides.assira.io.uri.URITime;
+import net.ranides.assira.io.uri.URIFlags;
+import net.ranides.assira.io.uri.URIHandle;
+import net.ranides.assira.io.uri.URIHandler;
+import net.ranides.assira.text.Charsets;
+import net.ranides.assira.text.StringTraits;
+
+/**
+ *
+ * @author Ranides Atterwim <ranides@gmail.com>
+ */
+public abstract class CHandler implements URIHandler {
+    
+    private static final String NSE = "Not supported by URIHandler: ";
+    
+    @Override
+    public URI uri(URIHandle ustream) throws IOException {
+        throw new IOException(NSE + scheme());
+    }
+
+    @Override
+    public File file(URIHandle ustream) throws IOException {
+        throw new IOException(NSE + scheme());
+    }
+
+    @Override
+    public Path path(URIHandle ustream) throws IOException {
+        throw new IOException(NSE + scheme());
+    }
+
+    @Override
+    public Charset charset(URIHandle ustream) throws IOException {
+        return Charsets.UTF8;
+    }
+    
+
+    @Override
+    public Set<URIFlags> flags(URIHandle ustream) throws IOException {
+        return URIFlags.collect();
+        
+    }
+
+    @Override
+    public Instant time(URIHandle ustream, URITime ut) throws IOException {
+        throw new IOException(NSE + scheme());
+    }
+
+    @Override
+    public long size(URIHandle ustream) throws IOException {
+        throw new IOException(NSE + scheme());
+    }
+
+    @Override
+    public URIHandle parent(URIHandle ustream) throws IOException {
+        throw new IOException(NSE + scheme());
+    }
+
+    @Override
+    public CQuery<URIHandle> scan(URIHandle ustream) throws IOException {
+        throw new IOException(NSE + scheme());
+    }
+
+    @Override
+    public InputStream istream(URIHandle ustream) throws IOException {
+        throw new IOException(NSE + scheme());
+    }
+    
+    @Override
+    public InputStream istream(URIHandle ustream, long begin, long end) throws IOException {
+        return IOStreams.limit(istream(ustream), begin, end);
+    }
+
+    @Override
+    public OutputStream ostream(URIHandle ustream) throws IOException {
+        throw new IOException(NSE + scheme());
+    }
+    
+    @Override
+    public Reader reader(URIHandle ustream, Charset cs) throws IOException {
+        return new InputStreamReader(istream(ustream), cs);
+    }
+
+    @Override
+    public Reader reader(URIHandle ustream) throws IOException {
+        return new InputStreamReader(istream(ustream), charset(ustream));
+    }
+
+    @Override
+    public Writer writer(URIHandle ustream, Charset cs) throws IOException {
+        return new OutputStreamWriter(ostream(ustream), cs);
+    }
+    
+    @Override
+    public Writer writer(URIHandle ustream) throws IOException {
+        return new OutputStreamWriter(ostream(ustream), charset(ustream));
+    }
+
+    @Override
+    public void delete(URIHandle ustream) throws IOException {
+        throw new IOException(NSE + scheme());
+    }
+
+    @Override
+    public void create(URIHandle ustream) throws IOException {
+        throw new IOException(NSE + scheme());
+    }
+
+    @Override
+    public void move(URIHandle ustream, URIHandle location) throws IOException {
+        throw new IOException(NSE + scheme());
+    }
+
+    @Override
+    public void copy(URIHandle ustream, URIHandle location) throws IOException {
+        try(InputStream istream = ustream.istream()) {
+            try(OutputStream ostream = location.ostream()) {
+                IOStreams.copy(istream, ostream);
+            }
+        } 
+    }
+    
+}

+ 20 - 67
assira/src/main/java/net/ranides/assira/io/uri/impl/CHttpHandler.java

@@ -6,7 +6,6 @@
  */
 package net.ranides.assira.io.uri.impl;
 
-import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
@@ -19,18 +18,15 @@ import java.net.MalformedURLException;
 import java.net.URI;
 import java.net.URL;
 import java.nio.charset.Charset;
-import java.nio.file.Path;
 import java.time.Instant;
 import java.util.Date;
 import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
-import net.ranides.assira.collection.query.CQuery;
 import net.ranides.assira.io.IOStreams;
 import net.ranides.assira.io.uri.URITime;
 import net.ranides.assira.io.uri.URIFlags;
 import net.ranides.assira.io.uri.URIHandle;
-import net.ranides.assira.io.uri.URIHandler;
 import net.ranides.assira.text.Charsets;
 import net.ranides.assira.text.StringTraits;
 
@@ -38,7 +34,7 @@ import net.ranides.assira.text.StringTraits;
  *
  * @author Ranides Atterwim <ranides@gmail.com>
  */
-public class CHttpHandler  implements URIHandler {
+public class CHttpHandler extends CHandler {
     
     static final CHttpHandler THAT = new CHttpHandler();
     
@@ -61,19 +57,9 @@ public class CHttpHandler  implements URIHandler {
         return ((CHttpHandle)ustream).uri;
     }
 
-    @Override
-    public File file(URIHandle ustream) throws IOException {
-        throw new IOException(HTTP_NS);
-    }
-
-    @Override
-    public Path path(URIHandle ustream) throws IOException {
-        throw new IOException(HTTP_NS);
-    }
-
     @Override
     public Charset charset(URIHandle ustream) throws IOException {
-        return getContentCharset(head(ustream).getContentType());
+        return getContentCharset(connect(ustream, "HEAD").getContentType());
     }
     
 
@@ -81,7 +67,7 @@ public class CHttpHandler  implements URIHandler {
     public Set<URIFlags> flags(URIHandle ustream) throws IOException {
         Set<URIFlags> re = URIFlags.collect(URIFlags.FILE);
         try {
-            HttpURLConnection c = head(ustream);
+            HttpURLConnection c = connect(ustream, "HEAD");
             re.add(URIFlags.READABLE);
             if(2 == (c.getResponseCode() / 100)) {
                 re.add(URIFlags.EXISTS);
@@ -106,28 +92,22 @@ public class CHttpHandler  implements URIHandler {
     @Override
     public Instant time(URIHandle ustream, URITime ut) throws IOException {
         if(ut == URITime.MODIFIED) {
-            HttpURLConnection c = head(ustream);
+            HttpURLConnection c = connect(ustream, "HEAD");
             if(null == c.getHeaderField("Last-Modified")) {
                 return Instant.ofEpochMilli(c.getDate());
             }
             return new Date(c.getHeaderFieldDate("Last-Modified", 0)).toInstant();
         }
-        throw new UnsupportedOperationException(HTTP_NS);
+        return super.time(ustream, ut);
     }
 
     @Override
     public long size(URIHandle ustream) throws IOException {
-        return head(ustream).getContentLengthLong();
-    }
-
-    @Override
-    public URIHandle parent(URIHandle ustream) throws IOException {
-        throw new UnsupportedOperationException(HTTP_NS);
-    }
-
-    @Override
-    public CQuery<URIHandle> scan(URIHandle ustream) throws IOException {
-        throw new UnsupportedOperationException(HTTP_NS);
+        HttpURLConnection c = connect(ustream, "HEAD");
+        if(2 != (c.getResponseCode() / 100)) {
+            throw new IOException(c.getResponseMessage());
+        }
+        return c.getContentLengthLong();
     }
 
     @Override
@@ -137,12 +117,10 @@ public class CHttpHandler  implements URIHandler {
     
     @Override
     public InputStream istream(URIHandle ustream, long begin, long end) throws IOException {
-        HttpURLConnection c = connect(ustream);
-        c.setRequestMethod("GET");
+        HttpURLConnection c = connect(ustream, "GET");
         c.setRequestProperty("Range", "bytes=" + begin + "-" + (end));
         if (c.getResponseCode() != HttpURLConnection.HTTP_PARTIAL) {
-            // @todo (assira #1) CFileHandler: istream(offset)
-            throw new UnsupportedOperationException("HTTP " + c.getResponseCode());
+            return IOStreams.limit(c.getInputStream(), begin, end);
         } else {
             return c.getInputStream();
         }
@@ -150,59 +128,39 @@ public class CHttpHandler  implements URIHandler {
 
     @Override
     public OutputStream ostream(URIHandle ustream) throws IOException {
-        HttpURLConnection c = connect(ustream);
-        c.setRequestMethod("PUT");
+        HttpURLConnection c = connect(ustream, "PUT");
         c.connect();
         return c.getOutputStream();
     }
     
     @Override
     public Reader reader(URIHandle ustream, Charset cs) throws IOException {
-        HttpURLConnection c = connect(ustream);
-        c.setRequestMethod("GET");
+        HttpURLConnection c = connect(ustream, "GET");
         c.connect();
         return new InputStreamReader(c.getInputStream(), cs);
     }
 
     @Override
     public Reader reader(URIHandle ustream) throws IOException {
-        HttpURLConnection c = connect(ustream);
-        c.setRequestMethod("GET");
+        HttpURLConnection c = connect(ustream, "GET");
         c.connect();
         return new InputStreamReader(c.getInputStream(), getContentCharset(c.getContentType()));
     }
 
     @Override
     public Writer writer(URIHandle ustream, Charset cs) throws IOException {
-        HttpURLConnection c = connect(ustream);
-        c.setRequestMethod("PUT");
+        HttpURLConnection c = connect(ustream, "PUT");
         c.connect();
         return new OutputStreamWriter(c.getOutputStream(), cs);
     }
     
     @Override
     public Writer writer(URIHandle ustream) throws IOException {
-        HttpURLConnection c = connect(ustream);
-        c.setRequestMethod("PUT");
+        HttpURLConnection c = connect(ustream, "PUT");
         c.connect();
         return new OutputStreamWriter(c.getOutputStream(), getContentCharset(c.getContentType()));
     }
 
-    @Override
-    public void delete(URIHandle ustream) throws IOException {
-        throw new UnsupportedOperationException(HTTP_NS);
-    }
-
-    @Override
-    public void create(URIHandle ustream) throws IOException {
-        throw new UnsupportedOperationException(HTTP_NS);
-    }
-
-    @Override
-    public void move(URIHandle ustream, URIHandle location) throws IOException {
-        throw new UnsupportedOperationException(HTTP_NS);
-    }
-
     @Override
     public void copy(URIHandle ustream, URIHandle location) throws IOException {
         try(InputStream istream = ustream.istream()) {
@@ -212,17 +170,12 @@ public class CHttpHandler  implements URIHandler {
         } 
     }
     
-    private HttpURLConnection head(URIHandle ustream) throws IOException {
-        HttpURLConnection c = (HttpURLConnection)((CHttpHandle)ustream).url.openConnection();
-        c.setRequestMethod("HEAD");
-        c.connect();
+    private HttpURLConnection connect(URIHandle ustream, String method) throws IOException {
+        HttpURLConnection c = (HttpURLConnection)((CHttpHandle)ustream).uri.toURL().openConnection();
+        c.setRequestMethod(method);
         return c;
     }
     
-    private HttpURLConnection connect(URIHandle ustream) throws IOException {
-        return (HttpURLConnection)((CHttpHandle)ustream).uri.toURL().openConnection();
-    }
-    
     private static Charset getContentCharset(String type) {
         if(null == type) {
             return Charsets.UTF8;

+ 54 - 37
assira/src/test/java/net/ranides/assira/io/uri/impl/CHttpHandlerTest.java

@@ -8,11 +8,16 @@ package net.ranides.assira.io.uri.impl;
 
 import java.io.FileNotFoundException;
 import java.io.IOException;
+import java.net.URI;
 import java.net.URISyntaxException;
+import java.time.Duration;
+import java.time.Instant;
+import net.ranides.assira.io.uri.URIFlags;
+import static net.ranides.assira.io.uri.URIFlags.*;
 import net.ranides.assira.io.uri.URIHandle;
-import net.ranides.assira.io.uri.URIResolver;
 import net.ranides.assira.io.uri.URITime;
-import net.ranides.assira.junit.NewAssert;
+import static net.ranides.assira.junit.NewAssert.*;
+import net.ranides.assira.text.Charsets;
 import net.ranides.assira.text.IOStrings;
 import org.junit.Test;
 
@@ -21,49 +26,61 @@ import org.junit.Test;
  * @author Ranides Atterwim <ranides@gmail.com>
  */
 public class CHttpHandlerTest {
-    
-    public CHttpHandlerTest() {
-    }
 
     @Test
-    public void testSomeMethod() throws IOException, URISyntaxException {
-        URIResolver r = new URIResolver().register(CHttpHandler.THAT);
+    public void testDynamicText() throws IOException, URISyntaxException {
         
-        URIHandle h1 = r.resolve("http://maven.ranides.net/net/ranides/assira/0.58/");
-        System.out.printf("uri     = %s%n", h1.uri());
-        System.out.printf("charset = %s%n", h1.charset());
-        System.out.printf("exists  = %s%n", h1.exists());
-        System.out.printf("flags   = %s%n", h1.flags());
-        System.out.printf("stream  = %s%n", IOStrings.read(h1.istream(10,40), h1.charset()));
-        System.out.printf("reader  = %s%n", IOStrings.read(h1.reader()).length());
-        System.out.printf("time    = %s%n", h1.time(URITime.MODIFIED));
-        System.out.printf("size    = %s%n", h1.size());
-        System.out.printf("%n");
+        URI uri = new URI("http://maven.ranides.net/net/ranides/assira/0.58/");
+        URIHandle handle = CHttpHandler.THAT.resolve(uri);
         
-        URIHandle h2 = r.resolve("http://maven.ranides.net/net/ranides/assira/0.58/assira-0.58.pom");
+        assertEquals(uri, handle.uri());
+        assertEquals(Charsets.UTF8, handle.charset());
+        assertEquals(true, handle.exists());
+        assertEquals(URIFlags.constant(READABLE, EXISTS, FILE, TEXT), handle.flags());
+        assertEquals("HTML PUBLIC \"-//W3C//DTD HTML 3", IOStrings.read(handle.istream(10,40), handle.charset()));
+        assertEquals(1231, IOStrings.read(handle.reader()).length());
+        assertEquals(Instant.now(), handle.time(URITime.MODIFIED), Duration.ofMinutes(60));
+        assertEquals(-1, handle.size());
 
-        System.out.printf("uri     = %s%n", h2.uri());        
-        System.out.printf("charset = %s%n", h2.charset());
-        System.out.printf("exists  = %s%n", h2.exists());
-        System.out.printf("flags   = %s%n", h2.flags());
-        System.out.printf("stream  = %s%n", IOStrings.read(h2.istream(10, 15), h2.charset()));
-        System.out.printf("reader  = %s%n", IOStrings.read(h2.reader()).length());
-        System.out.printf("time    = %s%n", h2.time(URITime.MODIFIED));
-        System.out.printf("size    = %s%n", h2.size());
-        System.out.printf("%n");
+    }
+    
+    @Test
+    public void testStaticText() throws IOException, URISyntaxException {
+        URI uri = new URI("http://maven.ranides.net/net/ranides/assira/0.58/assira-0.58.pom");
+        URIHandle handle = CHttpHandler.THAT.resolve(uri);
+
+        assertEquals(uri, handle.uri());
+        assertEquals(Charsets.UTF8, handle.charset());
+        assertEquals(true, handle.exists());
+        assertEquals(URIFlags.constant(READABLE, EXISTS, FILE, TEXT, SIZE, SEEK), handle.flags());
+        assertEquals("mlns=\"", IOStrings.read(handle.istream(10,15), handle.charset()));
+        assertEquals(6964, IOStrings.read(handle.reader()).length());
+        assertEquals(Instant.parse("2013-03-08T01:58:31Z"), handle.time(URITime.MODIFIED));
+        assertEquals(6964, handle.size());
+    }
+    
+    @Test
+    public void testNotFound() throws IOException, URISyntaxException {
+        URI uri = new URI("http://maven.ranides.net/net/ranides/assira/0.58/assira-0.58.po");
+        URIHandle handle = CHttpHandler.THAT.resolve(uri);
+        
+        assertEquals(uri, handle.uri());
+        assertEquals(Charsets.UTF8, handle.charset());
+        assertEquals(false, handle.exists());
+        assertEquals(URIFlags.constant(READABLE, FILE, TEXT, SIZE), handle.flags());
+        assertEquals(Instant.now(), handle.time(URITime.MODIFIED), Duration.ofMinutes(60));
         
-        URIHandle h3 = r.resolve("http://maven.ranides.net/net/ranides/assira/0.58/assira-0.58.po");
+        assertThrows(IOException.class, ()->{
+            handle.size();
+        });
+        
+        assertThrows(FileNotFoundException.class, ()->{
+            IOStrings.read(handle.istream(10,15), handle.charset());
+        });
         
-        System.out.printf("uri     = %s%n", h3.uri());
-        System.out.printf("charset = %s%n", h3.charset());
-        System.out.printf("exists  = %s%n", h3.exists());
-        System.out.printf("flags   = %s%n", h3.flags());
-        NewAssert.assertThrows(FileNotFoundException.class, ()->{
-            System.out.printf("reader  = %s%n", IOStrings.read(h3.reader()).length());
+        assertThrows(FileNotFoundException.class, ()->{
+            IOStrings.read(handle.reader());
         });
-        System.out.printf("time    = %s%n", h3.time(URITime.MODIFIED));
-        System.out.printf("size    = %s%n", h3.size());
-        System.out.printf("%n");
     }