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