package hansen.playground2;
import java.io.*;
import java.util.*;

public class MyFileStructure{ 
  private String dirname;
  private MyDir mdir;
  protected String result;

  public void setDirname(String dirname) {
    this.dirname = dirname;
  }

  public String getResult() {
    return result;
  }

  /*
  * Build a hierarchy of MyDir's and MyFile's for this directory
  */
  public void build() {
    File f = new File(dirname);
    mdir = build(f);
  }  

  /*
  * Build a hierarchy of MyDir's and MyFile's for "f"
  */
  private MyDir build(File f) { 
    if (!f.exists()) return null; 
    if (!f.isDirectory()) return null; 
    
    // f is an existing directory
    String path = f.getPath();
    String name = f.getName();
    MyDir mdir = new MyDir(path, name);

    // Loop thru files and directories in this path
    String[] files = f.list();
    for (int i = 0; i < files.length; i++) {
      File f2 = new File(path, files[i]);
      if (f2.isFile()) {
        mdir.addFile(new MyFile(path, files[i]));
      } else if (f2.isDirectory()) {
        File f3 = new File(path, files[i]);
        MyDir m = build(f3); // recursive call
        if (m != null) { mdir.addDir(m); }  
      }
    }
    return mdir;
  }  

  /*
  * Display the name of the file on System.out   
  */
  protected void outFile(MyFile f, int level) {
    String name = f.getName();
    result += repeat(" ",2*level) + "File: " + name + "\n";
  }  
  
  /*
  * Display the name of the directory on System.out
  */
  protected void outDir(MyDir d, int level) {
    String name = d.getName();
    result += repeat(" ",2*level) + "Dir: " + name + "\n";
  }  
  
  /*
  * Close display of the directory 
  */
  protected void outEndDir() {
  }  
  
  public void list() {
    if (mdir == null) {
      System.out.println("Not a valid directory");
      return;
    }
    result = "";
    outDir(mdir, 0);
    list(mdir, 0);
    outEndDir();
  }
  
  private void list(MyDir m, int level) {
    level++;
    Vector md = m.getDirs();
    for (int i = 0; i < md.size(); i++) {
      MyDir d = (MyDir)md.elementAt(i);
      outDir(d, level);
      list(d, level); // recursive call
      outEndDir();
    }  
    Vector mf = m.getFiles();
    for (int i = 0; i < mf.size(); i++) {
      MyFile f = (MyFile)mf.elementAt(i);
      outFile(f,level); 
    }  
  }  
  
  /*
  * Utility: return "n" times "c"
  */
  private String repeat(String c, int n) {
    StringBuffer s = new StringBuffer(n);
    for (int i = 0; i < n; i++) {
      s.append(c);
    }
    return s.toString();
  }
  
}