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