import java.util.HashMap;
import java.util.Map;

public class MapOfMapOfMaps {

    private Map map;

    public MapOfMapOfMaps() {
        super();

        this.map = new HashMap();

        this.map.put("key1", new HashMap());
        this.map.put("key2", new HashMap());

        this.addLevel2("key1");
        this.addLevel3("key1", "key1");
        this.addLevel3("key1", "key2");

        this.addLevel2("key2");
        this.addLevel3("key2", "key1");
        this.addLevel3("key2", "key2");

    }

    private void addLevel3(String level1Key, String level2Key) {
        final Map level2Map = (Map) this.getMap().get(level1Key);
        final Map level3Map = (Map) level2Map.get(level2Key);
        level3Map.put("key1", "value1");
        level3Map.put("key2", "value2");
    }

    private void addLevel2(String level1Key) {
        Map level2Map = (Map) this.map.get(level1Key);
        level2Map.put("key1", new HashMap());
        level2Map.put("key2", new HashMap());
    }

    public boolean equals(Object obj) {
        if (!(obj instanceof MapOfMapOfMaps)) {
            return false;
        }

        MapOfMapOfMaps other = (MapOfMapOfMaps) obj;
        return this.getMap().equals(other.getMap());
    }

    public Map getMap() {
        return this.map;
    }

    public int hashCode() {
        return this.getMap().hashCode();
    }

    public void setMap(Map map) {
        this.map = map;
    }

    public String toString() {
        return this.getClass().getName() + ": " + this.getMap();
    }
}
