public static Map load(String mapFileName) throws IOException, MapParseException {
        File file = new File(mapFileName);

        MapBean mapBean;
        try {
            mapBean = digester.parse(new FileInputStream(file));
        } catch (SAXException e) {
            throw new MapParseException(e);
        }

        // width, height
        int width  = Integer.parseInt(mapBean.getWidth());
        int height = Integer.parseInt(mapBean.getHeight());

        // tileSize
        int tilewidth  = Integer.parseInt(mapBean.getTilewidth());
        int tileheight = Integer.parseInt(mapBean.getTileheight());
        if (tilewidth != tileheight)
            throw new MapParseException("tilewidth != tileheight");
        int tileSize = tilewidth;

        // tileSet
        String source = mapBean.getTileset().getImage().getSource();
        String path = file.getParent() + File.separator + source;
        Image tileSet = new ImageIcon(path).getImage();

        // tileSetColumn
        int tileSetColumn = tileSet.getWidth(null) / tileSize;

        // background, middleground, foreground, collision
        List<LayerBean> layerList = mapBean.getLayerList();
        if (layerList.size() != 4)
            throw new MapParseException("layerList != 4");
        int[][] background   = parseLayer(layerList.get(0).getData().getData(), width, height);
        int[][] middleground = parseLayer(layerList.get(1).getData().getData(), width, height);
        int[][] foreground   = parseLayer(layerList.get(2).getData().getData(), width, height);
        int[][] collision    = parseLayer(layerList.get(3).getData().getData(), width, height);

        return new Map(tileSize)
                .setWidth(width)
                .setHeight(height)
                .setTileSet(tileSet)
                .setTileSetColumn(tileSetColumn)
                .setBackground(background)
                .setMiddleground(middleground)
                .setForeground(foreground)
                .setCollision(collision);
    }