private void createSubValue(Entity e, EasytoryFile subEntity, FilterListItem fiNext) {
   EasytoryFile subValue = createFile(subEntity, fiNext.getValue(), true);
   LinkedList<FilterListItem> search = new LinkedList<FilterListItem>();
   search.add(fiNext);
   Iterator<Thing> ti = controller.getFilteredThings(search, e.getName()).iterator();
   while (ti.hasNext()) {
     Thing t = ti.next();
     createFile(subValue, t.getName(), true);
   }
 }
  /** please refactor me! */
  public void createFilesystem() {
    EasytoryFile root = createRoot();
    Iterator<Entity> entities = controller.getEntities().iterator();
    while (entities.hasNext()) // all entities
    {
      Entity e = entities.next();
      EasytoryFile entity = createFile(root, e.getName(), true);

      Vector<FilterListItem> filterList = controller.getFilter(e.getName());
      Collections.sort(filterList);
      Iterator<FilterListItem> filterIter = filterList.iterator();

      EasytoryFile all; // Create all items
      if (filterIter.hasNext()) all = createFile(entity, "All", true);
      else all = entity;
      Iterator<Thing> items = controller.getThingsByEntity(e.getName()).iterator();
      while (items.hasNext()) {
        Thing t = items.next();
        createFile(all, t.getName(), true);
      }

      while (filterIter.hasNext()) // filter criteria
      {
        FilterListItem fi = filterIter.next();
        EasytoryFile subEntity = createFile(entity, e.getName() + " by " + fi.getValueName(), true);
        createSubValue(e, subEntity, fi);
        String lastFilterEntity = fi.getValueName();
        while (filterIter.hasNext()) {
          FilterListItem fiNext = filterIter.next();
          if (!lastFilterEntity.equals(fiNext.getValueName())) // next subEntity
          {
            subEntity = createFile(entity, e.getName() + " by " + fiNext.getValueName(), true);
          }
          createSubValue(e, subEntity, fiNext);
          lastFilterEntity = fiNext.getValueName();
        }
      }
    }
  }