RmsMidlet.java

**
 * Copyright (c) 2013 Nokia Corporation. All rights reserved.
 * Nokia and Nokia Connecting People are registered trademarks of Nokia Corporation.
 * Oracle and Java are trademarks or registered trademarks of Oracle and/or its
 * affiliates. Other product and company names mentioned herein may be trademarks
 * or trade names of their respective owners.
 * See LICENSE.TXT for license information.
 */

package com.nokia.example;

import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import javax.microedition.rms.RecordStore;

/**
 * MIDlet for benchmarking different record store access strategies.
 */
public class RmsMidlet
            extends MIDlet
            implements CommandListener {

    private Command exit;
    private Command run;
    private Command delete;
    private Form form;
    private long startTime;
    private long stopTime;
    private RmsConnection basicRms = new BasicRms();
    private RmsConnection badRms = new BadRms();
    private RmsConnection cacheRms = new CacheRms();
    private RmsConnection fileRms = new FileRms();
    private final String recordData = "some dummy data for record";

    public RmsMidlet() {
        form = new Form("RMS");
        exit = new Command("Exit", Command.EXIT, 1);
        run = new Command("Run", Command.SCREEN, 1);
        delete = new Command("Delete", Command.SCREEN, 1);
        form.addCommand(exit);
        form.addCommand(run);
        form.addCommand(delete);
        form.setCommandListener(this);
    }

    public void startApp() {
        Display.getDisplay(this).setCurrent(form);
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
    }

    public void commandAction(Command command, Displayable displayable) {
        if (command == exit) {
            destroyApp(true);
            notifyDestroyed();
        }
        else if (command == run) {
            new Thread(new Runnable() {
                public void run() {
                    execute();
                }
            }).start();
        }
        else if (command == delete) {
            new Thread(new Runnable() {
                public void run() {
                    reset();
                }
            }).start();
        }
    }


    private void log(String msg) {
        form.append(msg + "\n");
    }

    private void clear() {
        form.deleteAll();
    }

    private void execute() {
        init();
        log("Starting test...");
        String simpleResult = test(basicRms);
        log("Basic RecordStore:\n" + simpleResult);
        String badResult = test(badRms);
        log("Bad RecordStore:\n" + badResult);
        String cacheResult = test(cacheRms);
        log("Cache RecordStore:\n" + cacheResult);
        String fileResult = test(fileRms);
        log("File RecordStore:\n" + fileResult);
        log("Test done");
    }

    private void init() {
        clear();
        String[] stores = RecordStore.listRecordStores();
        if (stores == null) {
            log("Populating recordstores...");
            populateStore(basicRms);
            populateStore(badRms);
            populateStore(cacheRms);
            populateStore(fileRms);
            log("Populating recordstores done");
        }
    }

    private void populateStore(RmsConnection rms) {
        try {
            rms.open();
            rms.set(recordData.getBytes());
        }
        catch (Exception e) {
            log("Can not populate recordstores with the "
                + rms.getClass() + "!");
        }
        finally {
            rms.close();
        }
    }

    private void reset() {
        clear();
        log("Deleting recordstores...");

        // Remove normal record stores
        String[] stores = RecordStore.listRecordStores();
        for (int i = 0; stores != null && i < stores.length; i++) {
            try {
                RecordStore.deleteRecordStore(stores[i]);
            }
            catch (Exception e) {
                log("Deleting of the recordstore " + stores[i] + " failed!");
            }
        }

        // Remove file record store
        try {
            ((FileRms) fileRms).delete();
        }
        catch (Exception e) {
            log("Deleting of the recordstore FileRms failed!");
        }

        log("Deleting recordstores done");
    }

    private String test(RmsConnection rms) {
        String rtn = "";
        try {
            startTiming();
            rms.open();
            for (int i = 0; i < 100; i++) {
                byte[] data = rms.get();
                String out = new String(data);
                // sanity check - what goes in must come out
                checkEquals(recordData, out);
            }
            rms.close();
            stopTiming();
            rtn = getTime();
        }
        catch (SecurityException e) {
            rtn = "Not allowed to test";
        }
        catch (DataMatchException e) {
            rtn = "Tested data does not match";
        }
        catch (Exception e) {
            rtn = "Error in running the test";
        }
        finally {
            rms.close();
            return rtn;
        }
    }

    private class DataMatchException extends RuntimeException {
    }

    private void checkEquals(String expected, String actual) {
        if (expected.compareTo(actual) != 0) {
            throw new DataMatchException();
        }
    }

    private void startTiming() {
        startTime = System.currentTimeMillis();
    }

    private void stopTiming() {
        stopTime = System.currentTimeMillis();
    }

    private String getTime() {
        return (new Long(stopTime - startTime)).toString() + " ms";
    }
}