001package net.minecraft.world.chunk.storage;
002
003import java.io.DataInputStream;
004import java.io.DataOutputStream;
005import java.io.File;
006import java.io.IOException;
007import java.util.HashMap;
008import java.util.Iterator;
009import java.util.Map;
010
011public class RegionFileCache
012{
013    /** A map containing Files as keys and RegionFiles as values */
014    private static final Map regionsByFilename = new HashMap();
015
016    public static synchronized RegionFile createOrLoadRegionFile(File par0File, int par1, int par2)
017    {
018        File var3 = new File(par0File, "region");
019        File var4 = new File(var3, "r." + (par1 >> 5) + "." + (par2 >> 5) + ".mca");
020        RegionFile var5 = (RegionFile)regionsByFilename.get(var4);
021
022        if (var5 != null)
023        {
024            return var5;
025        }
026        else
027        {
028            if (!var3.exists())
029            {
030                var3.mkdirs();
031            }
032
033            if (regionsByFilename.size() >= 256)
034            {
035                clearRegionFileReferences();
036            }
037
038            RegionFile var6 = new RegionFile(var4);
039            regionsByFilename.put(var4, var6);
040            return var6;
041        }
042    }
043
044    /**
045     * Saves the current Chunk Map Cache
046     */
047    public static synchronized void clearRegionFileReferences()
048    {
049        Iterator var0 = regionsByFilename.values().iterator();
050
051        while (var0.hasNext())
052        {
053            RegionFile var1 = (RegionFile)var0.next();
054
055            try
056            {
057                if (var1 != null)
058                {
059                    var1.close();
060                }
061            }
062            catch (IOException var3)
063            {
064                var3.printStackTrace();
065            }
066        }
067
068        regionsByFilename.clear();
069    }
070
071    /**
072     * Returns an input stream for the specified chunk. Args: worldDir, chunkX, chunkZ
073     */
074    public static DataInputStream getChunkInputStream(File par0File, int par1, int par2)
075    {
076        RegionFile var3 = createOrLoadRegionFile(par0File, par1, par2);
077        return var3.getChunkDataInputStream(par1 & 31, par2 & 31);
078    }
079
080    /**
081     * Returns an output stream for the specified chunk. Args: worldDir, chunkX, chunkZ
082     */
083    public static DataOutputStream getChunkOutputStream(File par0File, int par1, int par2)
084    {
085        RegionFile var3 = createOrLoadRegionFile(par0File, par1, par2);
086        return var3.getChunkDataOutputStream(par1 & 31, par2 & 31);
087    }
088}