import java.util.ArrayList;

class File {
  protected String m_name;
  public File(String name) { m_name = name; }
  public String getName() { return m_name; }
  public void ls(){
     System.out.println(this.getName());
  }
}

class File2 extends File{
  public File2(String name) 
  { super(name); }

  public void ls(){
     System.out.println(this.getName()+" "+"Rendering");
  }   
}

class FileFactory {
   private File f;
   private File2 f2;
   private Directory d;
   
   public File getFile(String name){
      f = new File(name);
      return f;
   }
   
   public File2 getFile2(String name){
      f2 = new File2(name);
      return f2;
   }
   
   public Directory getDirectory(String name){
      d = new Directory(name);
      return d;
   }
     
}

class Directory {
  private String m_name;
  private int lev;
  private ArrayList m_files = new ArrayList();

  public Directory(String name) { m_name = name; }
  public void add(Object obj) { m_files.add(obj); }
  public void ls(int lev) {
    Ind.ent(lev); System.out.println(m_name);
    for (int i = 0; i < m_files.size(); ++i) {
      Object obj = m_files.get(i);
      // Recover the type of this object
      if (obj.getClass().getName().equals("Directory"))
         ((Directory)obj).ls(lev+2);
      else {
         Ind.ent(lev+2);
         // System.out.println( ((File)obj).getName() );
         ((File)obj).ls();
      }
    }
  }
}

class Ind {
  // here just to indent some blank spaces on a line
  public static void ent(int lev) { 
    for (int i=0; i<lev; i++) { System.out.print(" "); }
  }
}

public class FilesDirs {
  public static void main(String[] args) {
    FileFactory ff = new FileFactory();
    Directory one = ff.getDirectory("dir111"),
              two = ff.getDirectory("dir222"),
              three = ff.getDirectory("dir333");
    File a = ff.getFile("aa"), b = ff.getFile("bb"), c = ff.getFile("cc");
    File2 d = ff.getFile2("dd"), e = ff.getFile2("ee");
    one.add(a);
    one.add(two);
    one.add(b);
    two.add(c);
    two.add(d);
    two.add(three);
    three.add(e);
    
    // print tree root
    one.ls(1);
    
    // print inner tree root
    System.out.println("\n-------\n");
    two.ls(1);   
    
    // print a leaf
    System.out.println("\n-------\n");
    // d.ls(1);
    System.out.println(d.getName());

    }
}

