001    package org.crsh.vfs.spi.ram;
002    
003    import org.crsh.vfs.Path;
004    import org.crsh.vfs.spi.AbstractFSDriver;
005    
006    import java.io.IOException;
007    import java.lang.reflect.UndeclaredThrowableException;
008    import java.net.MalformedURLException;
009    import java.net.URL;
010    import java.util.ArrayList;
011    import java.util.Collections;
012    import java.util.HashMap;
013    import java.util.List;
014    
015    /** @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a> */
016    public class RAMDriver extends AbstractFSDriver<Path> {
017    
018      /** . */
019      private final Path root;
020    
021      /** . */
022      final HashMap<Path, String> entries;
023    
024      /** . */
025      URL baseURL;
026    
027      public RAMDriver() {
028        try {
029          this.root = Path.get("/");
030          this.entries = new HashMap<Path, String>();
031          this.baseURL = new URL("ram", null, 0, "/", new RAMURLStreamHandler(this));
032        }
033        catch (MalformedURLException e) {
034          throw new UndeclaredThrowableException(e);
035        }
036      }
037    
038      public void add(String path, String file) {
039        add(Path.get(path), file);
040      }
041    
042      public void add(Path path, String file) {
043        entries.put(path, file);
044      }
045    
046      public Path root() throws IOException {
047        return root;
048      }
049    
050      public String name(Path handle) throws IOException {
051        return handle.getName();
052      }
053    
054      public boolean isDir(Path handle) throws IOException {
055        return handle.isDir();
056      }
057    
058      public Iterable<Path> children(Path handle) throws IOException {
059        List<Path> children = Collections.emptyList();
060        for (Path entry : entries.keySet()) {
061          if (entry.isChildOf(handle)) {
062            if (children.isEmpty()) {
063              children = new ArrayList<Path>();
064            }
065            children.add(entry);
066          }
067        }
068        return children;
069      }
070    
071      public URL toURL(Path handle) throws IOException {
072        return new URL(baseURL, handle.getValue());
073      }
074    }