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

+ 0 - 1
assira/pom.xml

@@ -58,7 +58,6 @@
                                 
                                 
                                 <include>net/ranides/assira/math/Bitwise*</include>
                                 <include>net/ranides/assira/math/Bitwise*</include>
                                 
                                 
-                                <include>net/ranides/assira/text/ResolveDialect*</include>
                                 <include>net/ranides/assira/text/LexicalCast*</include>
                                 <include>net/ranides/assira/text/LexicalCast*</include>
                                 <include>net/ranides/assira/text/format/**</include>
                                 <include>net/ranides/assira/text/format/**</include>
                                 
                                 

+ 2 - 0
assira/src/main/java/net/ranides/assira/collection/query/CQueryAbstract.java

@@ -293,6 +293,8 @@ public abstract class CQueryAbstract<T> implements CQuery<T> {
         public CQuery<T> skip(int n) {
         public CQuery<T> skip(int n) {
             return new CQArray<>(source, offset+n, limit);
             return new CQArray<>(source, offset+n, limit);
         }
         }
+
+        // @todo (assira#2) CQuery#last optimize for arrays/collectios/others
         
         
     }
     }
         
         

+ 9 - 2
assira/src/main/java/net/ranides/assira/io/uri/URIResolver.java

@@ -12,6 +12,7 @@ import java.net.URI;
 import java.net.URISyntaxException;
 import java.net.URISyntaxException;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
+import java.util.Collections;
 import java.util.ServiceLoader;
 import java.util.ServiceLoader;
 import net.ranides.assira.collection.lists.RTList;
 import net.ranides.assira.collection.lists.RTList;
 import net.ranides.assira.collection.maps.GenericHashMap;
 import net.ranides.assira.collection.maps.GenericHashMap;
@@ -29,8 +30,14 @@ import net.ranides.assira.reflection.IClass;
  */
  */
 public final class URIResolver {
 public final class URIResolver {
     
     
-    public static final URIResolver DEFAULT = new URIResolver(ServiceLoader.load(URIHandler.class));
-    
+    public static final URIResolver DEFAULT = new URIResolver(Collections.emptyList());
+
+    static {
+        for (URIHandler h : ServiceLoader.load(URIHandler.class)) {
+            DEFAULT.register(h);
+        }
+    }
+
     private final MStore store = new MStore();
     private final MStore store = new MStore();
     
     
     private final Map<String, URIHandler> handlers;
     private final Map<String, URIHandler> handlers;

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

@@ -37,7 +37,7 @@ public class CClassPathHandler implements URIHandler {
 
 
     @Override
     @Override
     public Collection<String> schemes() {
     public Collection<String> schemes() {
-        return Arrays.asList("classpath");
+        return Arrays.asList("classpath", "cp");
     }
     }
     
     
     private class CClassPathHandle extends CHandle {
     private class CClassPathHandle extends CHandle {

+ 5 - 3
assira/src/main/java/net/ranides/assira/io/uri/impl/CFTPHandler.java

@@ -149,7 +149,9 @@ public class CFTPHandler implements URIHandler {
         @Override
         @Override
         public CQuery<URIHandle> scan() throws IOException {
         public CQuery<URIHandle> scan() throws IOException {
             FTPFile[] files = man.shared(hostname).listFiles(path, FTPFileFilters.NON_NULL);
             FTPFile[] files = man.shared(hostname).listFiles(path, FTPFileFilters.NON_NULL);
-            return CQueryBuilder.fromArray(files).map(f -> new CFTPHandle(ireplace(uri, f.getName())));
+            return CQueryBuilder.fromArray(files)
+                .filter(e -> !".".equals(e.getName()) && !"..".equals(e.getName()))
+                .map(f -> new CFTPHandle(ireplace(uri, f.getName())));
         }
         }
         
         
         
         
@@ -268,7 +270,7 @@ public class CFTPHandler implements URIHandler {
     
     
     private static URI ireplace(URI uri, String path) {
     private static URI ireplace(URI uri, String path) {
         try {
         try {
-            return new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(), uri.getPort(), path, "", "");
+            return new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(), uri.getPort(), "/" + path, null, null);
         } catch (URISyntaxException cause) {
         } catch (URISyntaxException cause) {
             throw new AssertionError("Invalid URI: " + path, cause);
             throw new AssertionError("Invalid URI: " + path, cause);
         }
         }
@@ -284,7 +286,7 @@ public class CFTPHandler implements URIHandler {
         
         
         public FTPHostName(URI uri, UserStore users) {
         public FTPHostName(URI uri, UserStore users) {
             host = uri.getHost();
             host = uri.getHost();
-            Optional<GenericMap<String>> uis = users.match(uri).first();
+            Optional<GenericMap<String>> uis = users.match(uri).last();
             if(uis.isPresent()) {
             if(uis.isPresent()) {
                 GenericMap<String> ui = uis.get();
                 GenericMap<String> ui = uis.get();
                 user = ui.getOptional(UserProperty.LOGIN);
                 user = ui.getOptional(UserProperty.LOGIN);

+ 83 - 0
assira/src/test/java/net/ranides/assira/io/uri/impl/CFTPHandlerTest.java

@@ -10,14 +10,29 @@ import java.io.IOException;
 import java.net.URI;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.net.URISyntaxException;
 import java.nio.charset.Charset;
 import java.nio.charset.Charset;
+import java.util.Map;
+import java.util.Optional;
+
+import net.ranides.assira.collection.maps.GenericHashMap;
+import net.ranides.assira.collection.maps.GenericMap;
+import net.ranides.assira.collection.maps.HashMap;
+import net.ranides.assira.collection.query.CQuery;
+import net.ranides.assira.collection.query.CQueryBuilder;
+import net.ranides.assira.credentials.UserProperty;
+import net.ranides.assira.credentials.UserStore;
 import net.ranides.assira.io.uri.URIHandle;
 import net.ranides.assira.io.uri.URIHandle;
 import net.ranides.assira.io.uri.URIResolver;
 import net.ranides.assira.io.uri.URIResolver;
+import net.ranides.assira.io.uri.URIUtils;
+import net.ranides.assira.reflection.util.ReflectUtils;
 import net.ranides.assira.text.IOStrings;
 import net.ranides.assira.text.IOStrings;
 import static net.ranides.assira.junit.NewAssert.*;
 import static net.ranides.assira.junit.NewAssert.*;
 import net.ranides.assira.text.Charsets;
 import net.ranides.assira.text.Charsets;
 
 
+import net.ranides.assira.trace.ExceptionUtils;
 import org.junit.Test;
 import org.junit.Test;
 
 
+import javax.naming.spi.Resolver;
+
 /**
 /**
  *
  *
  * @author Ranides Atterwim <ranides@gmail.com>
  * @author Ranides Atterwim <ranides@gmail.com>
@@ -28,6 +43,48 @@ public class CFTPHandlerTest {
     
     
     private static final String TEXT_2 = "infov1";
     private static final String TEXT_2 = "infov1";
 
 
+
+    @Test
+    public void testScan() throws URISyntaxException, IOException {
+        // @todo (assira#1) zjebane to jest
+        // FTPHandler jest konstruowany bez-argumentowo i wstawiany do URIResolver.DEFAULT
+        // w efekcie FTPHandler ma parent-resolver ustawiony na DEFAULT
+        // i ten handler będzie używany we wszystkich resolverach
+        // więc we wszystkich "user defined" resolverach FTPHandler nie będzie miał rodzica ustawionego na ten "user-defined"
+        // więc w efekcie zawsze będzie FTPHandler czytał np hasła/loginy z DEFAULT bazy userów
+
+
+        TStore users = new TStore();
+        System.out.println("!!!!! " + users);
+        URIResolver.DEFAULT.users(users);
+        URIResolver re = new URIResolver().users(users);
+
+        users.add("fu", "f12357_assira_ftp_test", "TTYKYbg25ijGxlnYBGfN");
+
+        URI u1 = new URI("ftp://f12357_assira_ftp_test:TTYKYbg25ijGxlnYBGfN@ftp.ranides.net/dir");
+        URI u2 = new URI("ftp://fu@ftp.ranides.net/dir");
+        URI u3 = new URI("ftp://fu@ftp.ranides.net/");
+        try(URIHandle handle1 = re.resolve(u1)) {
+            System.out.println(handle1.scan().map(e -> asName(e)).list());
+        }
+        try(URIHandle handle1 = re.resolve(u2)) {
+            System.out.println(handle1.scan().map(e -> asName(e)).list());
+        }
+
+        try(URIHandle handle1 = re.resolve(u3)) {
+            System.out.println(handle1.scan().map(e -> asName(e)).list());
+        }
+    }
+
+    private static String asName(URIHandle handle) {
+        try {
+//            return handle.path().toString();
+            return handle.uri().toString();
+        } catch (IOException e) {
+            throw ExceptionUtils.rethrow(e);
+        }
+    }
+
     @Test
     @Test
     public void testUser() throws URISyntaxException, IOException {
     public void testUser() throws URISyntaxException, IOException {
         URIResolver resolver = new URIResolver().register(CFTPHandler.class);
         URIResolver resolver = new URIResolver().register(CFTPHandler.class);
@@ -82,5 +139,31 @@ public class CFTPHandlerTest {
     private static String cast(String text, Charset source, Charset target) {
     private static String cast(String text, Charset source, Charset target) {
         return new String(text.getBytes(source), target);
         return new String(text.getBytes(source), target);
     }
     }
+
+    private static final class TStore implements UserStore {
+
+        private Map<String, GenericMap<String>> users = new HashMap<>();
+
+        @Override
+        public CQuery<GenericMap<String>> match(URI uri) {
+            System.out.println("???");
+            Optional<String> key = URIUtils.getLogin(uri);
+            return key.isPresent() ? find(key.get()) : CQueryBuilder.empty();
+        }
+
+        @Override
+        public CQuery<GenericMap<String>> find(String user) {
+            GenericMap<String> map = users.get(user);
+            return map!=null ? CQueryBuilder.of(map) : CQueryBuilder.empty();
+        }
+
+        public void add(String id, String login, String pass) {
+            GenericMap<String> map = new GenericHashMap<>();
+            map.put(UserProperty.LOGIN, login);
+            map.put(UserProperty.PASSWORD, pass);
+            users.put(id, map);
+        }
+
+    }
     
     
 }
 }