recordstorecache.java

来自「Sony Ericsson手机上的Facebook客户端全套代码」· Java 代码 · 共 351 行

JAVA
351
字号
// Decompiled by Jad v1.5.7g. Copyright 2000 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/SiliconValley/Bridge/8617/jad.html
// Decompiler options: packimports(3) 
// Source File Name:   RecordStoreCache.java

package se.southend.drops.cache;

import java.io.*;
import java.util.Enumeration;
import java.util.Hashtable;
import javax.microedition.rms.RecordStore;

// Referenced classes of package se.southend.drops.cache:
//            MemoryCache, CacheInfo, Cache

public class RecordStoreCache
    implements Cache
{
    private class Entry
    {

        CacheInfo info;
        int page;
        int pointer;
        int length;

        Entry(CacheInfo info, int page, int pointer, int length)
        {
            this.info = info;
            this.page = page;
            this.pointer = pointer;
            this.length = length;
        }
    }


    public RecordStoreCache()
    {
        setIndexTableName("CacheTOC");
        setPageName("Cache");
        setPageSize(0x10000);
        setNbrPages(15);
        indexTable = new Hashtable();
        memoryCache = new MemoryCache();
    }

    public void open()
    {
        read();
    }

    public static RecordStoreCache getInstance()
    {
        if(instance == null)
            instance = new RecordStoreCache();
        return instance;
    }

    public void setCacheInfo(CacheInfo cacheInfo)
    {
        infoClass = cacheInfo != null ? cacheInfo.getClass() : null;
    }

    public void setIndexTableName(String name)
    {
        indexTableName = name;
    }

    public void setPageName(String name)
    {
        pageName = name;
    }

    public void setPageSize(int pageSize)
    {
        this.pageSize = pageSize;
    }

    public void setNbrPages(int nbrPages)
    {
        this.nbrPages = nbrPages;
    }

    public byte[] get(String key)
    {
        byte data[] = memoryCache.get(key);
        if(data == null)
        {
            Entry entry = (Entry)indexTable.get(key);
            if(entry != null)
            {
                RecordStore page = null;
                try
                {
                    page = RecordStore.openRecordStore(pageName + entry.page, true);
                    data = new byte[entry.length];
                    System.arraycopy(page.getRecord(1), entry.pointer, data, 0, entry.length);
                    page.closeRecordStore();
                }
                catch(Exception e)
                {
                    System.out.println("Page nbr: " + entry.page);
                    System.out.println("Entry pointer: " + entry.pointer + "   Entry length: " + entry.length);
                    try
                    {
                        System.out.println("Page: " + page + "   records: " + page.getNumRecords() + "   size: " + page.getSize());
                    }
                    catch(Exception ee)
                    {
                        ee.printStackTrace();
                    }
                    e.printStackTrace();
                }
            }
        }
        return data;
    }

    public CacheInfo getInfo(String key)
    {
        CacheInfo info = memoryCache.getInfo(key);
        if(info == null)
        {
            Entry entry = (Entry)indexTable.get(key);
            if(entry != null)
                info = entry.info;
        }
        return info;
    }

    public void put(String key, byte data[])
    {
        put(key, null, data);
    }

    public void put(String key, CacheInfo info, byte data[])
    {
        if(data.length > pageSize)
        {
            System.out.println("Cache put error: data sizes greater than the page size not supported.");
            return;
        }
        if(memoryCache.size() + data.length > pageSize)
        {
            write();
            pageNbr++;
            if(pageNbr == nbrPages)
                pageNbr = 0;
        }
        memoryCache.put(key, info, data);
    }

    public void remove(String key)
    {
        if(memoryCache.contains(key))
            memoryCache.remove(key);
        else
            indexTable.remove(key);
    }

    public void empty()
    {
        memoryCache.empty();
        indexTable.clear();
    }

    public boolean contains(String key)
    {
        return memoryCache.contains(key) || indexTable.containsKey(key);
    }

    public String[] contents()
    {
        String memoryContents[] = memoryCache.contents();
        String contents[] = new String[memoryContents.length + indexTable.size()];
        for(int i = 0; i < memoryContents.length; i++)
            contents[i] = memoryContents[i];

        Enumeration en = indexTable.keys();
        for(int i = memoryContents.length; i < contents.length; i++)
            contents[i] = (String)en.nextElement();

        return contents;
    }

    public int size()
    {
        return memoryCache.size();
    }

    public void close()
    {
        write();
        memoryCache.close();
        indexTable.clear();
    }

    private void read()
    {
        RecordStore index = null;
        try
        {
            index = RecordStore.openRecordStore(indexTableName, true);
            if(index.getNumRecords() != 0)
            {
                ByteArrayInputStream indexInput = new ByteArrayInputStream(index.getRecord(1));
                DataInputStream indexData = new DataInputStream(indexInput);
                pageNbr = indexData.readInt();
                indexTable.clear();
                do
                {
                    if(indexData.available() <= 0)
                        break;
                    String key = indexData.readUTF();
                    int page = indexData.readInt();
                    int pointer = indexData.readInt();
                    int length = indexData.readInt();
                    CacheInfo info = null;
                    if(infoClass != null)
                    {
                        info = (CacheInfo)infoClass.newInstance();
                        info.read(indexData);
                    }
                    Entry entry = new Entry(info, page, pointer, length);
                    indexTable.put(key, entry);
                    if(page == pageNbr)
                    {
                        memoryCache.put(key, info, get(key));
                        indexTable.remove(key);
                    }
                } while(true);
            }
            index.closeRecordStore();
        }
        catch(Exception e)
        {
            e.printStackTrace();
            try
            {
                index.closeRecordStore();
                RecordStore.deleteRecordStore(indexTableName);
                index = RecordStore.openRecordStore(indexTableName, true);
            }
            catch(Exception ee)
            {
                e.printStackTrace();
            }
        }
    }

    private void write()
    {
        try
        {
            try
            {
                RecordStore.deleteRecordStore(pageName + pageNbr);
                Enumeration en = indexTable.keys();
                do
                {
                    if(!en.hasMoreElements())
                        break;
                    String key = (String)en.nextElement();
                    Entry entry = (Entry)indexTable.get(key);
                    if(entry.page == pageNbr)
                        indexTable.remove(key);
                } while(true);
            }
            catch(Exception e) { }
            byte bytes[] = serializeMemoryCache();
            memoryCache.empty();
            RecordStore page = RecordStore.openRecordStore(pageName + pageNbr, true);
            page.addRecord(bytes, 0, bytes.length);
            page.closeRecordStore();
            bytes = serializeIndexTable();
            page = RecordStore.openRecordStore(indexTableName, true);
            if(page.getNumRecords() == 0)
                page.addRecord(bytes, 0, bytes.length);
            else
                page.setRecord(1, bytes, 0, bytes.length);
            page.closeRecordStore();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }

    private byte[] serializeMemoryCache()
    {
        String contents[] = memoryCache.contents();
        byte result[] = new byte[memoryCache.size()];
        int pointer = 0;
        for(int i = 0; i < contents.length; i++)
        {
            String key = contents[i];
            CacheInfo info = memoryCache.getInfo(key);
            byte data[] = memoryCache.get(key);
            int length = data.length;
            indexTable.put(key, new Entry(info, pageNbr, pointer, length));
            System.arraycopy(data, 0, result, pointer, length);
            pointer += length;
        }

        return result;
    }

    private byte[] serializeIndexTable()
    {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        DataOutputStream dataOut = new DataOutputStream(out);
        try
        {
            dataOut.writeInt(pageNbr);
            Enumeration en = indexTable.keys();
            do
            {
                if(!en.hasMoreElements())
                    break;
                String key = (String)en.nextElement();
                Entry entry = (Entry)indexTable.get(key);
                dataOut.writeUTF(key);
                dataOut.writeInt(entry.page);
                dataOut.writeInt(entry.pointer);
                dataOut.writeInt(entry.length);
                if(entry.info != null)
                    entry.info.write(dataOut);
            } while(true);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        return out.toByteArray();
    }

    private static final String DEFAULT_INDEX_TABLE_NAME = "CacheTOC";
    private static final String DEFAULT_PAGE_NAME = "Cache";
    private static final int DEFAULT_PAGE_SIZE = 0x10000;
    private static final int DEFAULT_NBR_PAGES = 15;
    private static RecordStoreCache instance;
    private Hashtable indexTable;
    private MemoryCache memoryCache;
    private String indexTableName;
    private String pageName;
    private int pageSize;
    private int nbrPages;
    private int pageNbr;
    private Class infoClass;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?